What's New in Frappe
Every notable change across the Frappe ecosystem.
Today — Tuesday, October 27
Rebuild BOM Creator with CAD import, revisions and operations
BOM Creator gets a design view with CAD import, revisions and operations.
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.
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.
Reinstate duplicate entry check for manufacture entries (backport #58004)
fix: reinstate duplicate entry check for manufacture entries (backport #58004)
Reinstate duplicate entry check for manufacture entries (backport #58004)
The duplicate Manufacture entry check honours the overproduction allowance again.
Validate target asset when fetching WIP composite asset items (backport #61974)
The target asset is validated before its tagged Purchase Receipt items are fetched.
Validate asset when fetching capitalization asset details
fix(assets): validate asset when fetching capitalization asset details
Carry opening balance in Stock Analytics (backport #60967)
Periods without movements show the opening balance from before the report range, not zero.
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.
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.
Keep zero rate quoted by supplier on portal (backport v16 62269)
fix: keep zero rate quoted by supplier on portal (backport v16 62269)
Keep zero rate quoted by supplier on portal (backport 62269)
fix: keep zero rate quoted by supplier on portal (backport 62269)
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.
Translate accounting dimension validation labels
fix(accounts): translate accounting dimension validation labels
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.
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.
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 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.
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.
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.
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.
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.
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.
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.
Round cost center allocation percentage total
Percentages that total 100 after floating-point rounding now pass validation.
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.
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.
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.
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.
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.
Skip Studio Cypress binary installation outside tests
fix: skip Studio Cypress binary installation outside tests
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.
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.
The index boot lists one tile per app
The /apps index shows one tile per app that declares an `add_to_apps_screen` hook.
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.
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.
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.
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.
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.
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.
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.
The index page at /apps
/apps becomes a full-page launcher with a filter box over one tile per app.
Search the settings dialog
The settings dialog gets a search box that matches pane, block and field labels and descriptions.
Component blocks and the after-save registry
A settings component block loads its app's Vue file, and saves refresh the rail and page.
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.
The index shows Favourites
The /apps index shows the person's eight latest favourite records as chips, skipping any they can no longer read.
Bind act keys through useKeyboardShortcut
An act's key binding runs the act through the dispatcher, with the same checks a click gets.
V2 writes Route History, and the index shows Recent
Desk v2 records visits to Route History and the index lists recently opened items.
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.
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.
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.
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.
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.
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).
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.
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.
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.
Match the text spacing of other inputs
Link, Autocomplete and multiselect text uses the same letter spacing and font as Data and Select fields.
Show disable report button on standard reports
The Disable Report and Enable Report button appears again for users who can edit reports.
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.
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.
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.
Typst pdfs leave out the draft and cancelled heading
Typst PDFs now print the DRAFT and CANCELLED heading the way Chrome does.
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.
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.
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.
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.
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.
Scroll fields inside create lead and deal modals
The create modals on iPad scroll their fields inside the dialog, so all fields are reachable.
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.
Run migrate without importing litellm (backport #1000)
fix(ai): run migrate without importing litellm (backport #1000)
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.
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.
Check partner owns the team in partner customer list
fix(invoice): Check partner owns the team in partner customer list
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.
Advertise 3.1.0 at c2d6011a and 5c0b031e
feat(raven): advertise 3.1.0 at c2d6011a and 5c0b031e
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.
Stock, a frappe-ui style catalogue
Adds a Stock store catalogue template in the frappe-ui visual style.
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.
Integrate Razorpay checkout functionality
Fixes Razorpay checkout click-blocking by adjusting z-index.
Offer a bigger plan when a trial converts
After a trial converts, the Billing panel offers a bigger plan.
Explain that adding a card only sets up billing
The payment method form says a card bills at the next cycle, not now.
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.
Block reserved customer domains
Operators can reserve exact or prefix domain names so customers cannot claim infrastructure names.
A pool of trial keys minted ahead
Free trial servers get a Grove key from a pool that Central keeps ready.
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.
Link loan disbursement to repayment schedules made in v15
fix: link loan disbursement to repayment schedules made in v15
Synchronize the shared stage and camera subscriptions
The default shared stage stays consistent across participants, and hidden cameras stop receiving video.
Wait for receiver readiness before sending video
A camera that becomes visible waits until its receiver is ready, avoiding black tiles.
Keep shared stage and pinned tiles stable
Meeting tiles keep their slots when speaker activity or room membership changes.
Restore frappe.local.sites_path instead of deleting it
Fixes a test-run cleanup crash in the push tests.
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.
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.
Show the breadcrumb trail in the browser tab title
The browser tab shows the page's breadcrumb trail instead of "Frappe Cloud" alone.
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.
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.
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.
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.
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.
Yesterday — Monday, October 26
Make untranslatable dialog labels and tour titles translatable
Wraps about 20 dialog labels, descriptions and tour titles in `__()` so translators can reach them.
Print each company's currency on the dashboards
Dashboard amounts show each company's own currency symbol instead of the site currency.
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.
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.
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.
Multiple Product Bundle correctness bugs (backport)
Manual backport of #62149.
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.
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.
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.
Harden sales target variance reports
Territory target achievements are scoped by company, and the variance reports are corrected.
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.
Validate account mappings and supplier membership
Supplier Group rows must point to the matching company's accounts, and supplier membership is validated.
Validate Sales Person assignments and submitted team edits
Sales Team edits on submitted documents are validated, and Sales Person assignments are checked.
Validate Party Types and allow manager setup
Payment Entries now check party types and account types. Accounts managers can set up party types.
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.
Set bank accounts on internal transfer
Internal Transfer Payment Entries now record the paid-from and paid-to Bank Accounts.
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.
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.
Validate target asset when fetching WIP composite asset items
Checks the target asset before loading its tagged Purchase Receipt items.
Let HR roles link employees to any user except admins
Same change as #61894, on the version branch.
Let HR roles link employees to any user except admins
Same change as #61894, on the version branch.
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.
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.
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.
Protect payment reconciliation log allocations
Blocks API edits to read-only allocations and checks the current invoice balance, so an invoice cannot go negative.
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.
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.
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.
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.
The record page marks the fields a save refused
A refused save marks each empty mandatory field, including child rows, with a "required" message.
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.
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`.
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.
Beta print PDFs drop overflowing table rows (backport)
Beta print format PDFs print every table row, including rows that overflow the page.
Honour landscape in the chrome renderer (backport)
Landscape print formats come out landscape from the Chrome renderer.
Honour print settings pdf generator for standard printing (backport)
Standard printing follows Print Settings > PDF Generator, so Chrome formats work on servers without wkhtmltopdf.
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.
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.
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.
Keep each layout's own column widths when switching layouts
Switching list layouts no longer carries over the previous layout's column widths.
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.
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.
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.
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.
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.
Pdf with a password fails for typst print formats
Typst PDFs are now encrypted with the password, the same way Chrome PDFs are.
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.
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.
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.
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.
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.
Read the database name without the file walk (backport)
Backport of #6765.
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.
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.
Redesign marketplace on dashboard and app-embed
Redesigns the marketplace cards with a hovercard and updates the app-embed domain view.
Feat/persistence logs subpath
Lets `persistence.worker` and `persistence.logs` point at an existing PVC, so both volumes can share one claim.
Show days and hide seconds with largestUnit and smallestUnit
The Duration component gets `largestUnit` and `smallestUnit` props to show days or hide seconds.
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.
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.
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.
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.
Underline and strike every line of wrapped text
Underline and strikethrough now apply to every wrapped line, and hyperlinks are fixed the same way.
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.
Forward the query string in the agent relay
The relay on proxies drops query strings. Its database_only flag never reached the agent.
Keep frappe's header and footer template for other formats
Same change as #568, for the main branch.
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.
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.
Show unmatched value in button mode
A Combobox in button mode shows a saved value even when it isn't in the loaded options.
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.
Correct disabled background colors for switch toggle component
A disabled "on" switch and a disabled "off" switch now have different colors.
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.
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]`.
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`.
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.
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.
Publish command output at most every two seconds (backport)
Backport of #614 to master.
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.
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.
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.
Sunday, October 25
Remove orphan stock entry services module
Deletes the same leftover module on version-15-hotfix.
Remove orphan stock entry services module
Deletes a leftover module whose imports don't exist on version-16-hotfix, which blocks app install and update checks.
List every week, month and age bucket whatever the ledger size
Builds the week, month, and age-bucket rows from fixed lists, so charts show every period even when the ledger has fewer rows.
Accounting dimension shows in connections tab on stock entry, asset repair (backport #59658)
Renames the column breaks in the Accounting Dimensions sections so new dimensions stay on the form, not in the Connections tab.
Include work order in reserved stock for pick list
Counts stock reserved for the linked Work Order as available to a Pick List, so raw materials can be allocated and the Pick List can be submitted.
Prevent mixed payment sources in payment orders
Stops a Payment Order from importing Payment Requests and Payment Entries together, by removing the correct import button for the other source.
Split orders as per the schedules in the reference table (backport #52285)
Splits Get Outstanding Orders by payment terms, the same way invoices are already split.
Keep pricing rule discount percentage in unsaved form (backport #60522)
Stops setting the discount amount from a Discount Percentage pricing rule from resetting the percentage.
Clear source warehouse on non-transfer material requests (backport #62256)
Backport of #62256.
Clear source warehouse on non-transfer material requests
Clears the row Source Warehouse when a Material Request's purpose is not Material Transfer, so it no longer blocks saving.
Recalculate stock entry row amounts when qty changes (backport #60751)
Restores the qty handler so a Serial/Batch dialog's quantity updates transfer qty and amounts, avoiding a ZeroDivisionError.
Use operation output qty for semi-finished goods job cards
Sizes Job Cards for each operation by its BOM Output Qty, so the raw materials match the quantity produced.
Semi finished goods costs, create bom, scheduling and precision in operation units
Reads Job Card, completed quantity, and process loss in the operation's output item units for BOMs that produce an item at each operation.
Proforma Invoice bug fixes
Fixes the Proforma Invoice PDF so a partial proforma does not inherit the whole order's fixed discount and charges, plus two more calculation bugs.
Backport financial statement report bug fixes from develop
Brings fixes to Financial Ratios, Consolidated Financial Statements, and related reports from develop into version-16-hotfix.
Count Shop Floor OEE run time once per crew
Counts a Job Card's run time once when several operators log the same interval, so workstation OEE is not inflated.
Job card stuck on hold after all quantity is done (backport #62199)
Backport of #62199 to version-16-hotfix.
Job card stuck on hold after all quantity is done
Clears the On Hold flag when the quantity is recorded after pausing, so the Job Card can be submitted.
Stock Balance and Stock Ledger after Stock Reconciliation, with tests (backport #61918)
Makes Stock Balance match the stock ledger after a reconciliation and adds tests that check both reports against it.
Respect account payable checkbox in cheque printing
The account-payee message and its border print only when the template's Is Account Payable box is ticked.
Honor party field's "Ignore User Permissions" in Payment Entry
An Employee party no longer fails with "No permission" when its field opts out of user permissions.
Update flag for row-wise tax rounding settings
Sets the flag the tax calculation actually reads, so the client rounds tax row by row like the server and submitted totals stop differing.
Skip returns when recalculating item last purchase rate
The shared last-purchase lookup ignores return receipts and invoices, so cancelling a later purchase and Get Last Purchase Rate no longer pick up a return's rate.
Allow recalculate valuation rate only for purchase receipts, update stock invoices and non-transfer stock entries (backport #62287)
Backport of #62287 to a second hotfix branch.
Allow recalculate valuation rate only for purchase receipts, update stock invoices and non-transfer stock entries (backport #62287)
Backport of #62287 to version-16-hotfix.
Allow recalculate valuation rate only for purchase receipts, update stock invoices and non-transfer stock entries
Limits Repost Item Valuation's Recalculate Valuation Rate to purchase receipts, update-stock purchase invoices, and stock entries without transfer rows, so material transfers keep the correct source rate.
Support PgBouncer in session mode
Postgres sites can run behind PgBouncer in session mode, with rollbacks on close and a forced database drop.
Retry failed deliveries from the webhook request log
Adds a Retry button to failed webhook logs, resending the stored request through the same job as scheduled retries.
Print from a full-page preview
Printing a report opens a full-page live preview with print format, letter head, orientation, and column options.
Inline fields in Quick Entry and New Record rows, and Contact's insert mapping
Quick Entry and New Record layouts can define inline fields, so a Contact made from the list gets its email and phone.
Create a record from a Table MultiSelect field
The Table MultiSelect dropdown gets a Create button for the child table's Link doctype.
A Link field opens the record it names
Link and Dynamic Link fields get an arrow that opens the linked record, and read-only links show a clickable title.
Draw the error a host passes to a field control (desk-v2)
Cherry-pick of #45108 onto desk-v2, with grid cells and the row dialog showing their errors.
Draw the error a host passes to a field control
Every field control draws the error its host passes in, under the input.
Name the fields a save refused in the v2 error entry
The v2 save error lists each field that refused the save, so the record page can mark it.
Spell out .29, .57 and .58 correctly in money_in_words
Money in words no longer drops a cent for amounts ending in .29, .57, or .58, because cents are computed with Decimal.
UI tweaks for the panel, pages and suggested replies
Long suggested replies end in an ellipsis, and the Flow panel's bar, phone header, and form text are adjusted.
Back exits the panel's full screen; replies suggested more often
Back leaves full screen in the Flow panel, and the assistant offers suggested replies after more answers.
Fit view to screen, scroll both ways and keep Today working
The Gantt view fits the screen, scrolls both ways, opens on the tasks, and keeps the Today button working.
Hide the workspace shortcut badge when the count is 0
A workspace shortcut with no matching records shows only its arrow, not a gray 0 badge.
Save attachments when a non-admin user pulls emails
Non-admin users pulling emails with attachments no longer fail, because attachments are saved as they are for outgoing mail.
Long Int uses the number control; drop Fold and Attachment Gallery from the form
Long Int uses the number control and shows a plain integer. Fold and Attachment Gallery are dropped from the form and grid columns.
Drop Fold and Attachment Gallery through the shared set
Fold and Attachment Gallery no longer render as empty text inputs on the record page.
Draw the Attach Image thumbnail and its hover preview
Restores the Attach Image thumbnail and its larger hover preview in the form, grid cell, and row dialog.
Code-family editors start five lines tall on the record page
Cherry-pick of #45095 onto desk-v2, with a Playwright spec.
Code-family editors start five lines tall
Code, JSON, Markdown and HTML editors start five lines tall instead of a 32px strip, and still grow to their cap.
Grid columns scroll, text cells keep one line, cells and rows carry data attributes (desk-v2)
Cherry-pick of #45099 onto desk-v2.
Grid columns scroll, text cells keep one line, cells and rows carry data attributes
Grid columns keep a 128px minimum and scroll sideways, Text cells show one line, and grid rows and cells gain data attributes.
Table MultiSelect chips show their link titles
Table MultiSelect chips show each record's title, not its name, so they match the side panel.
Show each fieldtype's value correctly in the side panel
Side panel rows show each fieldtype the way the form control does, such as an Image summary or a Code first line.
Commit a Check as 1 or 0, as the server stores it
A Check saves as 1 or 0, so toggling it twice leaves the record clean.
Int field commits a whole number
An Int field drops the fraction on commit, matching the server, so `7.6` shows as `7`.
Share doctype rooms between views and restore them after reconnect
Lets several views share a doctype's realtime room, so leaving one view no longer cuts off the others. Rooms are restored after a reconnect.
Keep the chosen layout when the list is reopened
Reopening a list keeps the layout the user picked, unless a shared link's filters match a different layout.
Translate the DocType description in the title tooltip
Translates the DocType description shown in the list title tooltip.
Open the floating dock from the right edge in RTL
In right-to-left languages the dock opens from the right edge, where it sits.
Print format editor images only print for the uploader
Saves images uploaded in the print format editor as public files, so they print for every user.
Typst pdfs of builder print formats differ from chrome
Makes Typst output match Chrome for builder print formats in eight places, including zero margins, numbered text, and mismatched image extensions.
Distinguish nonexistent field from permission error in queries
A filter on a field that does not exist now says the field is missing, instead of showing a permission error.
Load cached Inter fonts through the plutoprint fetcher
Loads cached Inter fonts through the PlutoPrint fetcher, so PDF test processes no longer segfault at exit.
Links click in the wrong place with a header or footer
Moves each page's links along with its content when a header or footer is added, so clicking link text works.
Match and page translated doctypes like other doctypes
Link search on translated doctypes such as Country and Role matches, pages, and escapes `%` the same way as other doctypes.
Open the default app after login
Login now opens the user's Default App, after any Default Workspace or role home page.
Filtering on the comments column says field not found
Restores the permission error for `_comments` filters, since the new field check was hiding that column from the lookup. Fixes a failing test on develop.
Only one of several PDFs generated at once succeeds
Gives each PDF render its own tab for request capture, so concurrent renders no longer time out because one render took every request.
Run releases and translation syncs with Frappe Release Bot app (backport #44927)
Backport of #44927 to version-15-hotfix.
Run releases and translation syncs with Frappe Release Bot app (backport #44927)
Backport of #44927 to version-16-hotfix. It also removes `backport.yml`.
Run releases and translation syncs with Frappe Release Bot app
Moves release, release-notes, and translation workflows from a personal access token to a one-hour token from a GitHub App with only the scopes each job needs.
Preserve TLS for Redis client cache
Makes `rediss://` URLs use a TLS connection for the Redis cache client, where they were silently downgraded to plain TCP.
Add binlog_legacy_event_pos mariadb variable
Staff can set `binlog_legacy_event_pos` on a Database Server, applied without a restart.
Shorten the Details field
Shortens the advisory Details field to one or two sentences, since the other fields cover the rest.
Snap image, video and embed resizing to useful widths
Resizing an image, video, or embed snaps to useful widths with a guide line. Holding Alt resizes freely.
Charts in and out of .xlsx; import into a new file replaces its blank Sheet1
Sheets exports and imports charts in .xlsx, and importing into a new file no longer leaves an empty Sheet1.
Support portal integration
The console gets Help links to a support ticket and feedback URL, set per site.
Suspend and unsuspend a team from desk
Staff can suspend a team with a reason, which stops its servers and keys, and unsuspend it later.
Archive teams and impersonate a team owner
Owners can archive a team once six checks pass, and staff can restore it or open the console as its owner.
Let a site ask which providers are turned on
A site can ask Central which mail providers have one-click sign-in enabled, so it only shows those buttons.
Send operator alerts to a Raven channel
Billing operator alerts go to a Raven channel by default, with email only to a named list.
Manage gateway webhook endpoints and events from desk
Central reads and updates each payment gateway's webhook endpoint and events when keys change, and records more Stripe states.
Ensure we wait for all assets & mariadb before executing build workflows
Build workflows wait for release assets and MariaDB before running site operations.
Open the bench from a site without loading the dashboard
Adds a route that redirects straight to the bench login, with the same access checks as the dashboard link.
Open the server through Central's open_bench redirect
The Open server link goes straight to the bench instead of loading the Central dashboard first.
Keep the gap above posts that follow an activity
On phones, a comment or poll that follows an activity line gets its top spacing back.
Start an edit from text typed without a keydown (IME, symbol picker)
Text from IME input, the emoji picker, or phone keyboards starts a cell edit instead of being dropped.
A deleted named range no longer stops the others from moving
Named ranges keep following row and column edits after another named range is deleted, so formulas stop reading the wrong rows.
Rename message, colour pickers, charts under dialogs, ECharts notice
Shows a plain rename message for a taken title, makes colour pickers work in conditional formatting, and cleans up console noise.
Keep the formula bar on the selected cell after undo/redo
After undo or redo the formula bar and format toolbar stay on the selected cell, not jump to A1.
Saturday, October 24
Validate formulas by reading them instead of running them
Formula validation ran the formula with a fake value of 1.0 for every line reference, which rejected valid formulas. Formulas are now read instead, so no fake values are needed.
Stock Balance and Stock Ledger after Stock Reconciliation, with tests
Stock Balance showed a wrong quantity after a Stock Reconciliation on v15. Four bugs found by new tests are fixed.
Preserve cached bisect statement summaries
Revisiting a calculated node in Bisect Accounting Statements swapped the P&L and Balance Sheet summaries.
Keep Delivery Schedule Items in sync with their Sales Order (v16)
fix: keep Delivery Schedule Items in sync with their Sales Order (v16)
Keep Delivery Schedule Items in sync with their Sales Order
Updating items on a submitted order now rescales its delivery schedules, and deleting a draft order clears them.
Ignore cancelled entries when changing default valuation method
Stock Settings blocked a change of the default valuation method because of cancelled ledger entries. Only active entries are checked now.
Validate company abbreviation before naming
Naming an Account or Cost Center crashed with a TypeError when the company had no abbreviation. It now raises a clear validation error.
Ignore cancelled ledger entries when changing item stock uom
Changing an item's default UOM was blocked by cancelled stock ledger entries, so the mistake could not be fixed. Only active entries are checked now.
Apply company default terms only on draft transactions
Company default terms are applied only to drafts. Submitted documents keep their terms, so Update After Submit no longer fails.
Minor fixes in manufacturing, stock and buying
Same fixes as #62094 for version-15, plus the BOM `update_cost` change.
Minor fixes in manufacturing, stock and buying
Same as #62094 for version-16, plus validation in Workstation `get_job_cards`.
Minor fixes in manufacturing, stock and buying
Escapes node values in the BOM Configurator tree. Validates the POS Profile, Item and Purchase Order that the whitelisted methods receive.
Make Delivery Schedule Item read-only for users (v16)
fix: make Delivery Schedule Item read-only for users (v16)
Make Delivery Schedule Item read-only for users
Sales Users could create, edit or delete Delivery Schedule Items directly, bypassing the Sales Order service. The doctype is now read-only, and the role permissions no longer include create, write or delete.
Create in the list's header row, with no spinner while its dialog is open
The list's Create button moves to the header row beside the crumbs.
The full-page new record at //new
`//new` now opens a full-page new record, where it previously opened nothing.
Create a record from a Link field's dropdown
Link and Dynamic Link dropdowns end with a Create row when the user may create the linked doctype.
New form link field like combobox
Replaces the Awesomplete dropdown on Link, Autocomplete and MultiSelect fields with a combobox. It is off by default behind a System Settings beta toggle.
New filter panel, and a filter sheet on phones
The list Filter button opens a panel of rows with a searchable field picker and a value box that suits each field type. Phones get a filter sheet.
Merge flow into frappe
Merges the Flow AI agent into frappe. Users chat with it at `/flow`, and it acts with their permissions.
Print attachment ignores the document language
Auto Repeat emails now print in the document's language instead of the system language.
Print attachment fails on non-submittable documents
With draft printing off, notifications that attach a print no longer fail for doctypes that cannot be submitted, such as ToDo.
Improve experience of bench browse command
The URL respects `host_name` and SSL, `--user` lands on the page the login form redirects to, and the browser is not opened over SSH.
Show only one alert banner at a time on the login page
Success and error banners no longer appear together on the login page's forms.
Rebuild the module map after clearing the cache
On the first migrate after a pull adds a module, the new module's doctypes were not synced, so a patch failed with `TableMissingError`.
Name the record by its title in the list's Create toast
The toast shows the record's title instead of its hash or series name.
Return focus to the Link field after a Ctrl/Cmd+Enter save
After saving in a Link field's Create dialog, focus now returns to the field instead of the page body.
Keep @framework/ui out of the dev pre-bundle
With the desk running from source under Vite, Link and Dynamic Link fields lost their "Create" option.
Hidden fields don't open the Create dialog
A DocType whose only always-shown Create fields are hidden now opens the full-page new record instead of an empty dialog.
Open the Create dialog with focus in its first field
The dialog opens with focus on its first writable field, so Ctrl/Cmd+Enter works straight away.
Delete all rows of a table in a dialog
"Delete all rows" on a table field with more than one page of rows in a dialog threw an error and deleted nothing. It now clears the rows.
Ctrl/Cmd+S saves the Create dialog, never the page under a dialog
In a Create dialog, Ctrl/Cmd+S now saves the new record. On a record page it no longer triggers the browser's Save Page As.
Menu text cut off, menu tooltip stuck and shortcut badge empty
Menu text no longer clips at the bottom of letters, the menu tooltip no longer sticks after a pick, and a shortcut with a count of 0 shows 0.
Auto margins in print format css break pdf generation
A print format with `margin-left: auto` in its CSS could not be downloaded as PDF. Margin values that are not lengths are now skipped.
Multi-doctype bulk pdf stops at the first failing document
One failing document used to stop a multi-doctype bulk PDF job silently. The failure notice is now sent correctly, and progress counts from 1/N.
Bulk pdf with a password fails for typst print formats
Removes a check that rejected password-protected bulk PDFs for Typst print formats, because the merged PDF is encrypted once at the end.
Pdf links fail for documents with & or + in the name
Print links were HTML-escaped instead of URL-encoded, so `&` split the parameters and `+` became a space.
Keep field sidebar on screen with many tabs
On DocTypes with many tabs the form builder canvas grew wider than the screen, pushing the field sidebar off-screen.
Render Map View by declaring leaflet in required_libs
Map View rendered a blank box on every doctype after the refactor. Leaflet is now declared through `required_libs`.
Use the connection IP on the dev server
On `bench start`, the client IP comes from the connection instead of forwarded headers.
Evaluate component inputs once and validate studio paths
Component inputs that contain `{{ }}` now render as text instead of running as expressions. Studio page titles and component ids are scrubbed so exports stay inside the app's studio folder.
Add confirmation before cancelling request in pwa
Cancelling a submitted request in the PWA now asks for confirmation first.
Update pwa layout direction for rtl languages
The PWA sets `dir` on `` for right-to-left languages, and its left/right styles are now start/end.
Skip assignment masters the user can't read
Opening an Employee showed an Insufficient Permission error for users who could not read an assignment master. Those masters are now skipped.
Filter tree Link fields by descendants (inclusive)
Adds a "Descendants of (inclusive)" filter, so filtering Territory by a parent includes its child territories.
Keep setup choices and availability dots right
Setup choices are kept when saving fails. Renaming an availability status refreshes open tabs.
Skip setup wizard unless an installed app adds wizard steps
fix: skip setup wizard unless an installed app adds wizard steps
Studio-built customer portal
Customers get a new portal at `/help`, built as a Frappe Studio app. It needs frappe `develop` (v17).
Public knowledge base on the studio portal
The knowledge base moves to the Studio portal at `/help`, with public, customers-only and private articles.
Let the studio portal's calls through block_endpoints
On sites with `block_endpoints`, signed-out visitors to `/help` were sent to login and ticket pages returned a 404. The portal's calls now pass through, and each new method checks permission itself.
Redesign evaluator availability as a weekly hours table
Availability becomes a weekly hours table. Slots and Schedule tabs show only for Batch Evaluators.
Program member access on customised sites, plus faster CI
Staff keep read and write on program member fields on sites that customised LMS Program permissions.
Record exercise results only from the grading endpoint
A learner could write their own status and test results through the document API. The controller now rejects writes that do not come from the grading endpoint.
Scope mentions, lesson embeds and SCORM files
A discussion reply notifies a mentioned user only if they take part in that discussion, and at most 10 users are notified per reply.
Scope batch announcements and records filed by learners
Batch announcements show only mail sent by the batch's own staff. Quiz submissions lock the member's row before counting attempts, so parallel submits cannot exceed `max_attempts`.
Let a team scrape its own server metrics
Adds a second basic-auth user to the metrics file, so a team can scrape its own servers without changing Central's monitoring.
Mark support tickets raised via fc in url
Support links in the Frappe Cloud dashboard add `?utm_source=frappe-cloud` so support can see where tickets came from. It is for reporting only.
Mask traceback for errs in release pipeline ui
Release pipeline errors show a message instead of the raw traceback.
List sites without a successful backup in the daily audit
The daily audit now lists sites with 3 or more failed backups in 24 hours, plus sites with no successful backup in a day or in 3 days. A site that recovered no longer stays on the list.
Unique constraint on workspace members
Enforces one member row per user per workspace. A pre-sync patch removes duplicates first.
Show marketplace panel in cloud settings
Adds a Marketplace panel to the Cloud Settings dialog and moves to `@frappe/cloud-sdk` 0.4.1.
Snapshot metadata dir and allow restoration cluster wide and single node
Adds point-in-time snapshots of the metadata directory, with cluster-wide and single-node restore.
Grow the root file system when a running guest's disk grows
A udev rule runs `resize2fs` when the kernel reports a larger `/dev/vda`, so live disk resizes take effect.
Serve the site on every name in the zone
The site is aliased to `*.`, so a customer's chosen name serves as soon as Central routes it.
Add Get started onboarding dialog
feat: Add Get started onboarding dialog
Publish Studio apps and framework islands in prebuilt assets
Prebuilt assets now include Studio apps, so server builds of such apps no longer fail.
Stream site backups
With object storage configured, site backups stream straight to S3 without touching the server's disk.
Drain selected VMs
Metal Server Drain can be limited to selected VMs. Full-host drains still work.
Rebalance sleepy hosts under memory pressure
Sleepy VMs are drained from hosts at 85% memory, with four parallel migrations and up to three retries.
Show one included transfer for every server
Every server includes one monthly transfer allowance, set in Central Settings, instead of a different amount per plan.
Set the frappe version of a product trial
Each product trial can use a chosen Frappe version, such as `version-16`, instead of always `develop`.
Sign in on the chosen subdomain before the rename
A new trial site signs in on its chosen subdomain as soon as that name answers, rather than waiting for the rename.
Collab glue between IronCalc, the side stores and the Y.Doc
Connects each tab's workbook to the collab Y.Doc in both directions. Nothing changes for users yet.
Collab undo, only your own changes
Each tab undoes only its own changes, using a Yjs `UndoManager`. It is not wired into the editor yet.
Rebuild email suggestions around who you write to
Recipient suggestions rank people you write to first, and include enabled Suite users and shared mailboxes.
Backport email suggestions rebuild (#1063, #1064)
feat(mail): backport email suggestions rebuild (#1063, #1064)
Install translations on every boot path
The production web app showed English for every language because translations were never installed from the boot data.
Format document preview currency fields in their own currency
fix: format document preview currency fields in their own currency
Remove reference to unicommerce patch missing on version-16
A stale `patches.txt` entry made `bench migrate` fail with `ModuleNotFoundError` on v16 sites.
Frappe cloud marks the app incompatible with nightly benches
Frappe Cloud rejected the `-dev` upper bound, so the app was never marked compatible with nightly. The bound is now `<18.0.0`.
Warm start a VM whose disk is larger than the warm image
A VM with a larger disk than its warm image always cold booted. The warm match now accepts a disk at least as large as the warm disk.
Let drain history allow VM deletion
A VM moved by a Metal Server Drain could not be deleted because drain history rows blocked it. Deletion now ignores those links.
Select due sleep offloads on uuid columns
No VM went to deep sleep or coma because the due-work query failed on MariaDB `uuid` columns. It now checks `active_migration IS NULL`.
Show full setup alerts and a support email
The slow-setup and failure alerts on the setup page now show full text, and the failure alert includes a support email.
Lock snapshots and termination protection on trial servers
Trial servers refuse snapshots and termination protection, and an expired protected trial no longer keeps its server running.
Retry the trial sign-in while a small server is busy
A 0.25 vCPU trial server often stalled at sign-in while busy. Central now retries it while the server answers 429, 5xx or times out.
Name and open the chosen site address
The upgrade page and site emails show and open the customer's chosen address once it is active, not the automatic `site-*` name.
Warn that disk size cannot be decreased
The resize dialog warns that a larger disk is permanent, and the plan list leaves out plans that would shrink the disk.
Write the most specific hostname alias first
The `admin-vm-*` alias now takes precedence over the `*.` wildcard in nginx.
Redirect the Central VM hostname to a renamed site's new primary name
After a rename, the `site-*` VM hostname now redirects to the customer's new primary name.
Convert loan application tenure to instalments for non-monthly frequency
Tenure is in months, but it was read as an instalment count. A Loan Application gets a Repayment Frequency, so a 12-month Bi-Weekly loan now gets 26 instalments.
Bugs testers hit first (xlsx dates, import renames, focus, paste, chart, name box)
Fixes one-day date shifts in xlsx import and export, plus import, focus, paste, chart and name-box bugs found in a user-level round trip.
Shrink ranges when their first or last rows are deleted
Deleting the first or last row of a range shrinks the range, as Excel and Google Sheets do, instead of producing `#REF!`.
Keep styling, sizes, freeze, merges and conditional formats through xlsx
A round trip through Excel or Google Sheets no longer loses bold, colours, column widths, freeze panes, merges or conditional formats.
Rebuild address indexes when the account owner is disabled
The address index rebuild failed for accounts whose owner was disabled. It now runs for those accounts.
Fix disk overcommit, migration rollback and host recovery gaps (backport #460)
fix(atlas): Fix disk overcommit, migration rollback and host recovery gaps (backport #460)
Friday, October 23
Apply commit-analyzer options
(Release config fix; listed under Chores as well.)
Run snapshot reports on live data for users with permission restrictions
Snapshot mode runs General Ledger, Balance Sheet, Profit and Loss and Trial Balance on live data for users with User Permissions.
Correct value rendering on task info page
Fixes a filter precedence error so values with special characters display correctly.
Keep custom fields visible in primary address and contact section
Hides the primary address and contact fields one by one instead of the whole section, so custom fields still show.
Leave cancelled entries out of the item heatmap
The item heatmap ignores cancelled Stock Ledger Entries; stock quantities and values are unchanged.
Count only submitted documents in the sales person heatmap
The heatmap ignores draft and cancelled documents, matching the allocated amounts.
Validate installation note against delivery note (v15)
fix: validate installation note against delivery note (v15)
Read internal transfer rate settings from the correct cache key
A changed setting now applies immediately instead of after the cache TTL.
Multiple Selling Settings bugs (DN-required service rows, rate cache, monthly sales, section toggles, POS tax id)
Fixes several Selling Settings bugs, including service rows that cannot be invoiced when a Delivery Note is required, and a stale maintain-same-rate cache.
Party specific item rule gaps
Re-validates items on update after submit, applies group-level rules down the subtree, and allows an existing rule to be saved again.
Filter bundle components by purchase supplier
Purchase Orders created for several suppliers include only each supplier's bundle components.
Keep pending work orders open on shop floor
A Work Order with pending quantity stays on the Open tab after a partial job card submission.
Include payment entries in order advance payment status
Advance Payment Status on Sales and Purchase Orders counts payment entries, so a fully paid order no longer shows Not Requested.
Add the finished good row for items without serial or batch
Manufacture entries for items with no serial or batch get their finished good row again, so saving no longer fails.
Accept date objects in payment terms
Fixes a regression where creating a Purchase Invoice from a Purchase Receipt failed when a Payment Terms Template was applied.
Translate income and expenses at the transaction rate
Income and expenses are translated at the transaction rate, as the Consolidated Trial Balance already does.
Report other balance sheet accounts so net change matches cash
Adds a catch-all operations row so Net Change in Cash matches the cash balance.
Stop reports when an exchange rate is missing
Reports now fail when no exchange rate is found, instead of silently using 1 and showing wrong amounts.
Always convert to presentation currency at the closing rate
Financial statements convert foreign-currency balances at the closing rate, so an account's value no longer depends on unrelated accounts.
Price Moving Average purchase returns at the moving average on repost
Reverts a repost change that let a back-dated Moving Average purchase return take out more value than the warehouse held, leaving positive qty at a negative stock value.
Task gantt popup xss
Task and Project links in the Gantt popup are built with get_form_link, which closes an XSS hole.
Check warehouse user permission in stock read methods
Stock read methods skip default warehouses the user cannot access and refuse a warehouse the caller passes.
Check warehouse user permission in get_valuation_rate
A user who cannot access a warehouse can no longer read the item's valuation rate there.
Preserve company and bank ownership in payment orders
Journal Entries from Payment Orders keep the order's company, and bank accounts are limited to ones the user owns.
Respect disabled contact form and match customers only for signed-in senders
Skips Lead and Opportunity creation when the Contact Us form is disabled, and links a message to a customer only when the sender is signed in.
Limit which call logs employees can read
Employees see a call with no receiving agent only when they are its linked user.
Show the page stepper at the top of multi-step forms
Shows a compact stepper at the top of multi-step Web Forms, replacing the footer progress dots.
Server side of Create — mandatory-only Quick Entry default and a New Record layout
Quick Entry shows mandatory fields by default, and desk v2 gets a full-page New Record layout.
Backport v2 discovery API and MCP server
Adds the v2 discovery API and an MCP server at /api/v2/mcp for reading and writing documents and calling methods.
Merge studio into frappe
Adds Studio, a visual Vue app builder, as a beta module.
Incorrect title for second link field pointing to same doctype in list view
(Listed above under the backport author; no separate summary needed.)
Clear the cached webhook list when one is deleted
Same fix for version-16; TestWebhook also clears the cache, which had been failing the MCP tests that run after it.
Clear the cached webhook list when one is deleted
Deleting a webhook clears the cached list, so later saves stop queueing the deleted webhook.
Add each file once when zipping
A file that is already in the zip archive is not read and written again.
Don't validate Print Settings when backfilling bulk export limits
The backfill patch no longer validates Print Settings.
Chromium download fails on newer or non-debian arm64 linux
Uses a single linux-arm64 Chromium download for every arm64 Linux host.
Composer attachment chips: paperclip icon, enter/leave animation, pasted URLs stay links
Attachment chips share one paperclip icon and animate in and out, and pasted URLs stay as links.
Clear uploader errors when a file is removed
Removing a file also clears its "already in the list" error.
Keep side-by-side buttons aligned while one shows its spinner
Buttons are vertically centred, so a neighbour no longer shifts 3px when one shows its spinner.
Keep develop sites unchanged until desk v2 is turned on
Makes desk v2 opt-in per site, so develop sites that have not enabled it behave as before.
Restore CSS variables dropped by the Espresso migration
Restores the old border-radius and invert-neutral variables as aliases to the new tokens, so existing Desk styles render again.
Restrict viewer user info lookup to desk users
Website users now get a permission error from the viewer user info lookup, and desk users see the same results as before.
Ship CRM guidance as an assistant skill
Replaces the MCP agent instructions in MCP Settings with a CRM skill that ships with the app.
Use the rebuilt import wizard, which frappe version-16 now ships
Points the import page at the renamed wizard so the main-hotfix frontend build passes again.
Hand out hybrid standby sites only on rule match
Stops a signup from a country with no rule getting another country's hybrid site from the shared standby queue.
Record a daily backup audit doctype instead of Raven
Records a daily backup audit doctype in place of the Raven digest, with agent job success rates and failing sites.
Do not fetch files separately in timeline button
fix: do not fetch files separately in timeline button
Guided setup, per-company config, exemptions, and UX overhaul
Adds a guided setup wizard, per-company configuration, exemptions and a UX overhaul, migrated to Frappe v16.
Add OAuth client credentials token
Lets Shopify Dev Dashboard apps connect with client credentials and renews tokens automatically.
Provision script dbus
Lets the frappe user run systemctl on its own services.
Automatic disk expansion / node addition of OSC
feat: Automatic disk expansion / node addition of OSC
Unify Suite user and storage administration
Replaces the Mail dashboard with an admin-only Suite dashboard for users, storage, mail and settings.
Suite Cloud Agent for Stalwart nodes
Adds a stdlib Go agent for Stalwart nodes that tails logs, samples the machine, scrapes Prometheus metrics and pushes batches to the telemetry API.
Keep the new idle timeout after a resize
Keeps the requested idle timeout after an in-place VM resize, and builds Metal with Go 1.26.10 to fix a failing security scan.
Add VM sleep states
Reports sleeping, deep-sleeping and comatose VM states in Metal and Atlas.
Rank balanced hosts by memory band, storage, then CPU
Placement ranks hosts by memory band, then storage pressure, then CPU pressure, and no longer prefers hosts with fewer VMs from the same tenant.
Name kernels and download them from Desk
Kernel records get titles and can be downloaded from their Desk form.
Show the trial and step through payment in billing
Shows trial days left above the plan and walks owners through billing details and payment.
Settings tab for turning prompt logging on/off
feat(ai): settings tab for turning prompt logging on/off
Rework the firewall rule editor
Gives the firewall editor fixed table columns, removable address chips and undo.
Smoother server creation and operator links
Opens the new server's page once it is ready, puts network options behind feature flags, and adds Open in Desk and Atlas links.
Send signup attribution with trial_requested
The trial_requested event carries UTM and referrer attribution from the Team.
Add bare metal yield report and dashboard
Adds a report and Insights dashboard comparing potential rate-card revenue with cash revenue.
Sign in to the same account automatically on reconnect
Reconnecting passes a login hint, so the provider skips its account picker.
Set default disk and network limits for new servers
New servers get default disk and network limits, so one server cannot use all of a host's capacity.
Free product trials with locked server access
Product signups get one 7-day trial site with no server access; direct signups add a card and get full access.
One-click Email oauth mail sign-in for V2 sites
Sites connect a mailbox in one click through a provider app that Frappe Cloud owns; Central keeps the app secret and gives each site only its own mailbox tokens.
Remove the user guide link from the README
fix: remove the user guide link from the README
Keep migrate off the telemetry DuckDB file
Migrate no longer opens the DuckDB file, so a read lock held by a dashboard query cannot fail it.
Fix (native): Workspace name in notification
fix (native): Workspace name in notification
Send CORS headers for the app on Frappe 15
Sets the CORS headers the mobile app needs on Frappe 15, which had blocked the boot request after sign-in.
Keep deferred repayment start date on pre payment and advance payment
A pre-payment or advance payment no longer moves the first EMI earlier than the agreed deferred start date.
Remove unused failing storage calc
fix: Remove unused failing storage calc
Restart the admin in a new process after an update
The admin restart runs in a new process, so it loads only the new code instead of failing with an ImportError.
Keep custom lines in the generated configs
Pilot's managed Redis block keeps lines outside it, so operators can load modules such as RediSearch.
Copy a missing kernel from the migration source
A migrated VM copies its kernel from the source host, so its next cold boot does not depend on an expired kernel URL.
Share kernels and keep them while VMs use them
Each kernel is stored once, and archiving an image no longer deletes a kernel that running VMs need, so a stopped VM can boot again.
Thursday, October 22
Items tab on customer and supplier
Adds an Items tab to Customer and Supplier forms, listing frequently ordered items and the party's item restriction rules, which can be added or removed there.
Backport 25 selling, buying and setup fixes from develop (v15)
Cherry-picks 25 fixes already merged to develop into the v15 hotfix branch, covering stock, selling, buying, accounts and setup.
Round debit credit diff before comparing in make_round_off_gle
Rounds the debit and credit difference before comparing it, so float error no longer drops a round-off entry and leaves a 0.01 imbalance.
Match payment entry to visible number format
POS payment input uses the invoice currency's number format for precision, so whole-unit currencies accept whole amounts.
SMS Center recipient and receiver-list bugs
Fixes a crash in the Lead (Open) recipient list, sends SMS to the correct number when a name or number contains a hyphen, and stops duplicate or missing contacts for All Contact.
SMS Center recipient and receiver-list bugs (v15)
Manual backport of #61679 to v15 with the same SMS Center fixes.
SMS Center recipient and receiver-list bugs (v16)
Fixes a crash when selecting All Lead (Open), splits receiver numbers on the last " - " so hyphenated names reach the right number, and de-duplicates All Contact recipients.
Restore v15 behaviour for party specific item
A party with Party Specific Item rules sees only the matching items again, Customer and Supplier Group rules apply to their members, and save blocks items outside the list.
Account for process loss in plan progress
The Production Plan Visualizer subtracts process loss from pending quantities and completion percentages, so completed production no longer shows as pending.
Toggle commission sections across selling forms
The Enable tracking sales commissions setting now also shows or hides the commission and sales team sections on Sales Order, Delivery Note and POS Invoice, not only Sales Invoice.
Show error for unmatched scan in barcode scan dialog
Scanning a value that is not a matching barcode, batch or serial in the scan dialog now plays the fail sound and shows an error, as the duplicate scan already did.
Skip serial nos earlier disassemblies already used
A later partial disassembly skips serial numbers already used by earlier disassemblies of the same source, so it no longer fails with "already present in the warehouse".
Round unallocated repair cost to field precision
Rounds the remaining repair cost to the field's precision so an exact-remainder allocation no longer fails with a false "exceeds available amount" error (closes #60234).
Reset foreign currency payment request status on cancellation
Cancelling payments on a foreign-currency Payment Request now resets its status correctly instead of setting it to Partially Paid, by comparing amounts in the same currency.
Rename test_runner.py files so CI discovers them
fix(tests): rename test_runner.py files so CI discovers them
Run web, realtime and jobs in one process (backport #41867)
Adds an opt-in single-process runner for small or trial sites, serving the web app, realtime and background jobs from one uvicorn process.
Bound and filter the linked documents lookup
The linked documents lookup accepts optional filters, a limit and an order, so callers can fetch only the newest or non-cancelled records.
Add plutoprint as a light pdf generator
Adds PlutoPrint as a PDF engine that runs inside the Python worker, so most PDFs no longer start a browser. Pages that need JavaScript or barcodes still use Chromium.
Feat(notification)!: Migrate Slack Webhook URL to generic Notification Webhook URL
Replaces the Slack-only webhook field with a generic Notification Webhook URL that also supports Google Chat, Mattermost, Rocket.Chat, Discord, Ntfy, Raven, Matrix via Hookshot, and Microsoft Teams. Existing Slack URLs migrate through patches.
Run GET-only methods as GET
Methods whitelisted only for GET can now be called over MCP, which previously refused them. Other methods still run as POST.
Keep the picked PDF renderer when saving a print format
Saving a print format no longer overwrites the chosen PDF renderer with Chromium when the format has no stored value.
Show core pdf generators on sites with an options override
Sites where an app had overridden the PDF Generator options now get PlutoPrint and Typst in the list after migrate, so picking them no longer silently saves Chrome.
Use Inter in print format editor pdfs
Print format editor PDFs use Frappe's bundled Inter font, so servers without Inter no longer fall back to DejaVu. A "Default" font also prints in Inter.
Keep a layer's own additions in Manage Dock
Dock entries that a layer added are listed in Manage Dock, so saving no longer deletes them.
Do not change documents when the classic board loads
Opening a classic Kanban board no longer resets the column of cards edited elsewhere and re-saves them under the viewing user. Moving cards on the board still updates them.
Revert "fix(assign_to): require write permission to remove another user's assignment"
Reverts #44820. The author says the read-only removal behaviour is intended.
Require write permission to remove another user's assignment
Removing someone else's assignment now requires write permission on the document, matching what the UI offers. The server previously checked only read access.
Split phone number lookup for server side linking
Separates the server-side phone lookup used by call and WhatsApp linking from the one the UI uses.
Guide MCP agents through CRM workflows
Adds CRM instructions to MCP Settings, such as converting leads instead of creating deals by hand.
Update lead and deal modified time on WhatsApp messages
Sending or receiving a WhatsApp message updates the lead or deal's modified time, following the "Update timestamp on new communication" setting.
Keep the availability dot inside the avatar so list cells don't clip it
Moves the availability dot onto the avatar's corner so list cells no longer cut off its bottom edge.
WhatsApp errors when the app is not installed and template empty states
Stops the "App whatsapp is not installed" toast on lead and deal pages, skips the WhatsApp recipient check when the app is absent, and adds empty states for templates.
Disambiguate option correctness and explanation labels in LMS Question
Gives each option's "Is Correct" and "Explanation" field a unique label, which matters because bulk import matches on labels.
Send the quiz unload beacon's CSRF token in the body
The quiz auto-submit beacon sends its CSRF token in the request body instead of the URL, so the token no longer lands in proxy access logs.
Course outline fields, Getting started for moderators and the first-course flow
The course outline no longer returns every lesson's video link, quiz id and question to anyone who can view the course, including guests.
Batch progress, activity heatmap, POST-only actions and evaluation bookings
Batch student progress is now limited to site administrators, Moderators, and the batch's tagged instructors or evaluators. Holding the Batch Evaluator role alone no longer exposes other batches' students.
Rotate a site's database password from desk
Adds a staff-only action on the Site form that generates a new database password and applies it on the bench's database server.
Notify the team when a job fails on a full disk
Sends an actionable notification when an agent job fails with "No space left on device", instead of the generic failure notice.
Report public database server metrics
Raises the database server disk alert threshold to 91% and the OOM kill alert threshold to 30 kills.
Exempt system managers from the employee checks
Same change as #7807, opened on the main branch.
Weekly installs query and protected names
Passes the app name to the marketplace weekly installs query as a parameter instead of an f-string, and limits `@protected` to a single str or int document name.
Declare the insights version range
Declares the insights version range that Pilot's dependency checks require.
Block editing standard apps outside developer mode
Blocks edits to standard apps outside developer mode, on the server and in the UI, and makes Vue components follow the same rule as pages.
Feat(default site backups)
New sites and sites with no backup policy get a default daily backup through the hourly bench job. Sites with a custom schedule keep it.
Mail and Calendar install as apps of their own
Gives Mail and Calendar their own manifests and install identities, while the rest of the Suite keeps its existing app.
Mail on a phone as an app of its own
Gives Mail its own phone bottom bar and title row, with folder, search and profile tabs.
Calendar on a phone as an app of its own
Gives Calendar its own phone bottom bar, with the current view as the first tab and a sheet for switching views and calendars.
Install is offered once, quietly, then from Profile
Offers app install once on a phone, with a slim strip above the bottom bar, and then from Profile. A dismissal sticks per device and per app.
Advertise v3.2.0
Publishes the Frappe Assistant Core 3.2.0 entry on the stable channel.
Add passkeys to the registry
Lists the passkeys app for v15 and v16, which adds passkey sign-in and a `@passkey_protected` decorator for approving sensitive actions.
Check challans on TRACES and support correction returns
Adds a Check on TRACES button that looks up a challan by BSR code, serial number and deposit date through Sandbox, and supports correction returns.
Return termination protection in the get VM response
Adds an is_termination_protected field to the get VM response, so clients can check deletion protection without a list call.
Collect node logs and metrics into Insights
Stores logs, traces and metrics from Stalwart mail nodes via a new telemetry API, loads them into Insights' DuckDB, and ships two dashboards.
Keep the masked prefix on the key
feat(keys): keep the masked prefix on the key
Termination protection on cloud boxes
Cloud machines can enable AWS termination protection from a button, with Sync reading the state back. Terminate and Archive refuse to release the Elastic IP while protection is on.
Fix(central)…
Removes an unused ptype argument from a permission check that never reached the socket server.
Remove notification_title and notification_message
Removes two fields that were unused after the matching change in frappe/frappe#42472.
Phone loose ends
Keeps a folder's title row visible when the folder is empty, and limits Mail's and Calendar's Profile to their own settings.
A gray folder no longer empties the account
Accounts with a Gray folder no longer show an empty Inbox, because the API contract now accepts the Gray colour.
Allow full pending principal in normal repayment
Normal Repayment accepts the overdue amount plus the principal not yet due, so a borrower can pay off the loan and close it. Paying more is still blocked.
Use loan repayment frequency in loan disbursement
A disbursement takes the loan's repayment frequency instead of defaulting to Monthly, and the field fills in when the loan is picked.
Use loan repayment start date in loan disbursement
A disbursement made from the form uses the loan's repayment start date when its own date is empty, so the first repayment no longer lands on the product's cycle date.
Guard and monitor what the audit found
Adds checks at the lowest level that can hold each problem a production billing audit found, such as unexplained wallet balances, over-cap trial spend, wrong-currency billing and unsynced billing profiles, plus daily monitoring to catch them.
Wednesday, October 21
Make BOM steps section collapsible after submit and fix its bottom border
Backport of #61693.
Make BOM steps section collapsible after submit and fix its bottom border
The Steps summary of a BOM with Produce an Item at Each Operation can be collapsed after submit.
Group the item variant details under templates, filter by warehouse
Same change, on develop.
Clearer labels for Produce an Item at Each Operation
Same change, on develop.
Clearer labels for Produce an Item at Each Operation
Backport of #61410. Work Order uses the same labels as the BOM.
Step guide and clearer messages for Produce an Item at Each Operation
Same change, on develop.
Step guide and clearer messages for Produce an Item at Each Operation
Backport of #61411. Job Card gets a step guide, a stock check before moving materials, and Submit only once the job is done.
Clearer setup for Produce an Item at Each Operation
Same change, on develop.
Clearer setup for Produce an Item at Each Operation
Backport of #61409. Renames "Track Semi Finished Goods", adds a Steps list and one message that lists every step problem.
Add item filter to trends reports
Adds an Item multi-select filter to all seven trends reports, so the total row reflects the filter.
Advance validation uses company currency precision
An advance of KWD 3.071 against a USD invoice is no longer rejected because the total was rounded to invoice-currency precision.
Exclude closed rows from drop ship delivery progress
Closed rows are ignored when recalculating the linked Sales Order's delivery percentage.
Prevent dropship deliveries against closed order items
Closed Purchase Order items no longer appear in the Deliver (Dropship) dialog.
Let asset capitalization and repair roles use their forms
Accounts and manufacturing roles can open Asset Capitalization and Asset Repair forms.
Find ratio groups without typed group accounts
Financial Ratios no longer show 0 when no shipped chart type covers the group accounts.
Show input and output VAT of a reverse-charge invoice
Reverse-charge invoices no longer net to zero in the VAT Audit Report.
Working-time holds and failing overdue agreements in SLA
Paused time is added in working time, and an agreement fails once its deadline passes.
Match Lost Opportunity period on the date it was lost
A later edit no longer moves a lost opportunity out of its report period.
Match call log phone numbers on their normalised digits
Call log numbers match Contact, Lead and Employee numbers even when they contain spaces, dashes or brackets.
Keep the outstanding unchanged by Show Future Payments
The Show Future Payments option no longer changes the outstanding shown as of the report date.
Check is_group before filtering tree accounting dimensions
Accounting Dimension Filters on trees without an is_group field, such as Employee, no longer raise PermissionError.
Exclude previous fiscal years from P&L account opening in GL
Income and expense accounts open at zero each fiscal year in the General Ledger, instead of carrying the previous years' totals.
Resolve current active call recipients
Call popups use current Active Employee records, not copied Employee Group user IDs. Duplicate group members are rejected.
Preserve POS rounding and hide missing in-words fields
Saving Global Defaults no longer overwrites a POS Profile's rounding setting.
Reject duplicate holiday dates across value types
Server-side scripts that append a Python date can no longer save a date already in the Holiday List.
Clear customer incoterms from purchase orders
A Sales Order's customer delivery terms are no longer copied into the supplier Purchase Order.
Validate brand defaults
Shares company-default validation across Item, Item Group and Brand. Rejects duplicate company rows, company mismatches and inventory account conflicts.
BOM, Job Card, Workstation and other manufacturing fixes
Backports bug-review fixes for Plant Floor, Routing, Workstation, BOM Update Log, BOM, BOM Creator, Downtime Entry and Job Card.
Production Plan, Material Request and planning fixes
Backports bug-review fixes for Sales Forecast, Production Plan, MRP report, Blanket Order, Material Request and Master Production Schedule.
Apply dated supply to each demand merged into an MRP row
Supply that arrives in time for each merged demand is counted, not just the first.
Count deleted rows in the update items blanket order check
Rows removed in the same Update Items action are included in the blanket order quantity check.
Match each repeated operation to its own BOM row in create BOM
Repeated operations on a BOM each take their own fixed-time and batch-size settings, instead of the first matching row's.
Keep transferred materials in stock UOM for returns and backflush
Return Components and backflush use stock UOM when a component was transferred in several units.
Stock Entry and Work Order fixes
Backports bug-review fixes for Item Alternative, Stock Entry Type, Stock Entry, Manufacturing Settings and Work Order.
Receipt, pick list, reservation and quality inspection fixes
Backports a batch of bug-review fixes for Quality Inspection, Warehouse, Pick List, Stock Reservation Entry and Purchase Receipt.
Post order billing provisional reversals from the posted provision
An invoice made after a cancelled invoice now reverses the correct provision.
Round purchase stock qty and ordered qty for whole number stock UOM
Backport of #61566 to v15-hotfix.
Round purchase stock qty and ordered qty for whole number stock UOM
Backport of #61566 to v16-hotfix.
Round purchase stock qty and ordered qty for whole number stock UOM
Stops fractional leftovers such as 99.9999999 Nos on Purchase Order stock qty and the Bin's Ordered Qty.
Keep over-receipt qty whole for whole number UOMs
Over-receipt allowances on whole-number UOMs no longer produce fractional quantities, such as 4.5 Nos, that break Purchase Receipt saves.
Add sub-assembly operating cost in company currency
Operating cost from sub-assemblies is converted to company currency instead of being added in the BOM currency.
Hand subcontracted operation inputs over to the subcontracting order
Backport of #61519 for v16-hotfix.
Hand subcontracted operation inputs over to the subcontracting order
A Work Order no longer double-counts inputs that a Subcontracting Order has taken over.
Keep job card transfers on their operation's rows
A Job Card transfer is credited only to the rows of its own operation, not to other operations' rows.
Correct workstation status and refresh floor view
Material transfers no longer leave a Workstation showing red on the Plant Floor, and Job Card status changes now notify open floor views.
Reserve job card materials from their source warehouse
A Subcontracting Order reserves from the Job Card's source warehouse by default, not the finished-good warehouse.
Validate consumed batches on the serial and batch bundle
The Incorrect Batch Consumed check also reads batches from the bundle, and one empty row no longer stops checks for the rows after it.
Don't divide by zero when no finished good is received
Same change, on develop.
Accept operator filters in BOM item query
Same change as #61625, on develop.
Keep Asset Capitalization consumed asset value at disposal-date book value
Consumed Manual-depreciation assets use their book value on the capitalization date instead of the salvage value, so the new asset's cost is no longer understated.
Exempt delivery returns from sales order requirement
Returns against Delivery Notes made without a Sales Order are no longer blocked when the Sales Order requirement is turned on.
Preserve picked reservations when updating items
Updating Sales Order items no longer cancels reservations that have been picked, so the remaining stock is reserved again.
Correct delivery progress and reservation limits
Closing a row no longer counts Skip Delivery service rows in delivery progress. Stock reservation checks now count existing reservations across all warehouses.
Keep Work Order target warehouse from BOM, then company, then item
The target warehouse now falls back in order: BOM default, company finished goods, item default, item group default. It is filled when BOM items are fetched, so the form shows it before save.
Reject zero-quantity validation bypass
A stale has_unit_price_items flag let Sales Orders with zero quantities pass validation after Allow Zero Quantity was disabled.
Optional Python realtime server
Backport of the Python Socket.IO server for v16. Node stays the default.
Set up OTP App on the login screen
The first OTP App login shows the QR code on the login screen instead of sending the user to a separate page and back.
Permission checks no longer load every child table of single doctypes
Same change as #44730, on develop.
Print B and C series paper sizes in portrait
B and C series sizes were stored landscape-wise. B5 now prints 176mm wide and 250mm tall.
Keep the search_link log message on one line
Removes interpolated request values from the missing-link-field log message.
Header script on a report letter head runs
The header is saved after its script is added, the same order the footer already uses.
Chromium download works on newer or non-Debian arm64 Linux
Backport of #44788. The Chromium download no longer fails on newer or non-Debian arm64 systems.
Prints use the default font when none is picked
Same change as #44789, on develop.
Network print failures show the real error
Same change as #44791, on develop.
Print attachment uses the document language by default
Same change as #44790, on develop.
Report view ID column opens the form again
With split view on, clicking a record ID opens the form instead of the side panel. Other link columns still open the side panel.
Related settings in the doctype settings dialog are translated
Same change as #44732, on develop.
Submit after import works on update imports
Same change as #44734, on develop.
Postgres CI failures in storage GC, prepared report and sync jobs
Fixes storage GC aborting its transaction, empty errors on failed prepared reports, and a sync job that left `frappe.job` set and broke delete_bulk tests.
Resolve conflicts for backport of #43534
Resolves merge conflicts for the v16 backport of #43534 and keeps the status check on the Download Report button.
Show every line of a failed report's error message
The report view and notification show the full error, including Postgres DETAIL and HINT lines. Only the query and caret lines are dropped.
Customize form edits to saved states, links and actions are kept
Changes to existing states, links and actions no longer revert after Update. The form and grid now edit the same row object.
Apply an update sent while an island mounts
Fixes number cards that stayed in the loading state because an update arrived while the island's stylesheet was loading.
Compare saved timestamps as datetimes
A document saved at a whole second can now be saved or submitted again. Previously it failed with TimestampMismatchError.
Rounds the Desktop search bar
Restores the rounded corners on the Desktop search bar in v16 by using the theme's radius token.
Open the active item's group after switching shells
Same change as #44798, on develop.
Update dependencies with security fixes
Bumps 37 Python packages to recent releases, including security fixes for nh3 (SVG and MathML XSS), GitPython and pypdf. No code changes were needed.
Limit routes accepted per request
Keeps only the latest 100 routes per batch, skips routes longer than 140 characters, and ignores the client-sent creation time.
Mask secret-looking keys in captured request body
Request JSON and form data sent to Sentry now go through the same key masking used for logged form dicts.
Rate limiter counter is created atomically
Creates the counter with SET NX plus TTL in one call, so simultaneous requests at the start of a window can't reset it.
Site cache keys and failed attempt tracking in 2FA login
Same change as #44795, on a separate backport branch.
Group the ticket list by fields with counts and totals
Adds Group By to the agent ticket list, with counts, averages and totals, saved with the view. Grouped exports match the list.
Pass create_lms_certificate's target to get_mapped_doc as a doc
Create Certificate from an evaluation no longer raises AttributeError on v16 sites.
Fix quiz submit on page unload when CSRF is enforced
Auto-submit beacons now include the CSRF token, so sites that enforce CSRF no longer reject them.
Progress bar on number cards
Number cards can show a progress bar toward their target, or out of 100% for percent measures.
Read schema-qualified tables in native SQL
The SQL editor accepts schema.table and resolves names the way PostgreSQL does.
Fix Insights schema-qualified tables
Backport of #1520, on a second branch.
Fix Insights schema-qualified tables
Backport of #1520. Native SQL can read schema-qualified PostgreSQL tables.
Even better onboarding UX
Signup moves from the code to the site name without a page reload, and the waiting page shows the chosen address and real progress.
Polls inside comments
A Poll button in the comment editor lets users write text before and after a poll in the same comment.
Answer each key's month spend, drop the usage peek
Adds a spend endpoint for keys and removes the never-deployed usage peek.
A resolved Stuck Usage row lists the records it landed as
Resolved rows list the usage records they produced, and the list is removed with the row.
Central sets a team's prompt logging
Central's console can show and change whether the gateways store a team's prompts and outputs.
Visible bugs around typed formats, dates, percent formulas and row refit
Fixes sheet values typed as $1.50, 15%, 1,000 or dates, which were stored as bare numbers and broke sorting, charts, pivots and export.
Free the subdomain of a terminated server
A subdomain on a terminated server no longer shows "That name is taken" forever. The check also treats Site Domain routes as holding a name until their removal succeeds.
Tuesday, October 20
Update YouTube statistics by time since the last update
The hourly job updates YouTube statistics based on time since the last update, so frequencies such as "6 hrs" run as set.
Account for return entries by default in Sales Partner Transaction Summary
Return entries are netted by default, matching Sales Partner Commission Summary; untick the filter to see only outward lines.
Closed-document amount and total double-counting in Sales Person-wise Transaction Summary
Manual backport of #61280.
Closed-document amount and total double-counting in Sales Person-wise Transaction Summary
Closed documents in a non-stock UOM use the transaction-UOM qty, and totals count each item line once.
Group sales person filter and amount total in Sales Person Commission Summary
Manual backport of #61178.
Group sales person filter and amount total in Sales Person Commission Summary
Selecting a sales person group includes its members, and the amount total counts each document once.
Reject template items in production plans
Production Plan rows for template items are rejected, since they cannot become Work Orders; variants still work.
Normalize Item opening stock before comparison
Opening stock given as a string such as "0" no longer raises a TypeError on Item insert.
Return correct batch qty when ignore_sre is not passed
Batch availability no longer returns zero, because a `[None]` filter was excluding matching stock entries.
Order transaction deletion batches by name
Transaction deletion fetches batches in name order, avoiding a temp-file failure on large tables.
Reset company values without saving the company (backport #55021)
Transaction Deletion resets the company's cached fields directly, so a validation hook on Company can no longer stop a deletion.
BOM Stock Analysis report review follow-up
Maximum Producible Items keeps a unit for a recurring quantity per unit.
Serial No and Batch Traceability report review follow-up
The backward trace follows an intermediate batch to the entry that made it.
Production Planning Report review follow-up
Raw material returned from a Work Order is no longer treated as already issued.
Production Plan Summary report review follow-up
Pending qty is correct when a second Work Order replaces lost units.
Incorrect Stock Value Report review follow-up
Item rows show only warehouses of the selected stock account.
Available Serial No report review follow-up
Opening serial numbers include entries that have no Serial and Batch Bundle.
Landed Cost Voucher review follow-up
A Landed Cost Voucher with both a purchase and a return row can be submitted.
Stock Closing Entry review follow-up
The final check before publishing a closing balance also looks for changed ledger entries and pending revaluations, so no posting is missed.
Stock ledger, reposting and closing fixes (backport)
Backports bug-review fixes for stock ledger, reposting, bin and closing doctypes to version-16-hotfix.
Review follow-ups of the bug-review backports (backport)
Backports review follow-ups for traceability, BOM stock analysis, production plan, landed cost, stock closing and more to version-16-hotfix.
Item master, variant, pricing, settings and batch fixes (backport)
Backports bug-review fixes for nine item-master, pricing, settings and batch doctypes to version-16-hotfix.
Subcontracting Receipt batch review follow-up
A disabled batch can no longer be consumed as a supplied raw material on a Subcontracting Receipt.
Item merge review follow-up
Merging items keeps the source item's open orders, which were lost when its stock balance rows were deleted.
Include subsidiaries of a selected group company
Selecting a group company includes its subsidiaries' ledgers, as the Consolidated Financial Statement does.
Show delivery worked out from order or invoice
The Delivery Note column shows the value derived from the Sales Order or update-stock invoice.
Warn when the serial no is not delivered to the claim customer
A Warranty Claim warns when its Serial No was not delivered to the claim's customer.
Record resolution metrics and opening time without an SLA
Resolution date, resolution time and hold time are recorded for Issues that have no SLA.
Reverse returns at the lower deduction certificate rate
A debit note reverses TDS at the lower certificate rate, not the category rate, once the certificate is used up or expired.
Allow deleting draft assets and log all repair events
Draft assets can be deleted, and repair events are all logged.
Keep an entered depreciation rate on reschedule
With Written Down Value and a salvage value, an entered depreciation rate is no longer replaced on every reschedule.
Require finance book on value adjustment for assets with named books
An Asset Value Adjustment on an asset with named finance books must name one, so its journal entry and asset row update the same book.
Keep sale and return entries of an asset stable on repost
Reposting ledger entries no longer changes an asset's sale and return entries.
Share revaluation adjustments with split assets
Revaluation adjustments move with the new assets when an asset is split, so disposal credits the right amount.
Delivery Note credit note review follow-up
Fixes credit notes for returns in another unit, which came out smaller than they should, plus one more credit note bug.
Packing, shipment, delivery note and delivery trip fixes (backport)
Backports bug-review fixes for Packing Slip, Shipment, Delivery Note and Delivery Trip to version-16-hotfix.
Net adjustment entries on Serial and Batch Wise Stock Balance batch rows
Applies the same netting to batch rows of the Serial and Batch Wise Stock Balance report, so they match the item row.
Net adjustment entries in the Stock Balance snapshot
Stock Balance's In and Out columns net an Adjustment Entry into one change, instead of showing all stock going out and back in.
POS serial check and cross-table serial picks for auto picked serial and batch rows
Follow-up to #61449: fixes the POS serial check and serial picks on auto-picked serial and batch rows, where the Serial No field stayed empty.
Do not fetch serial nos for batch items when using serial/batch fields (backport #61449)
Backport of #61449 to version-15-hotfix.
Do not fetch serial nos for batch items when using serial/batch fields (backport #61449)
Backport of #61449 to version-16-hotfix.
Do not fetch serial nos for batch items when using serial/batch fields
With Use Serial / Batch fields on, picking a batch for a serial-and-batch item no longer fills the Serial No field, and three related row fixes are included.
Do not count produced rows as consumed
An empty source warehouse on a produced row is treated like a missing one, so a semi-finished good is no longer counted as consumed when made.
Do not reserve semi-finished goods the work order makes itself
Work Orders stop reserving semi-finished goods that an earlier operation of the same order makes; rework items stay reserved.
Remove the Stock Delivered But Not Billed account from the US chart
On version-16-hotfix only, removes account 11430 from the US chart, so creating a company with that chart works again.
Limit prospects report to permitted records
Prospects Engaged But Not Converted lists only the Leads, Opportunities, Quotations and Issues the user can read.
Apply party permissions to contracts
User Permissions on Customer, Supplier and Employee now limit contract access, since Party Name is a Dynamic Link.
Territory-wise Sales report amount and permission bugs
Same change as #61530, for another branch.
Optional sections component
Adds a component for optional form sections that users add with a button and remove again.
Revised priority icons
Replaces the priority and signal icons in the framework and the kanban board.
Allow make attachment public in customize form
Adds "Make Attachment Public (by default)" to Customize Form for Attach fields on standard doctypes.
Desk draws its charts with frappe-ui charts
New sites draw Desk charts and number cards with frappe-ui; existing sites stay on the classic charts through a setting.
Let Vite pick its minifier
Island builds on Vite 8 no longer fail, because the minifier is left to Vite's default instead of being named as esbuild.
CSV-to-PO translation migration
The bench migrate-csv-to-po command keeps translations of strings containing %, merges CSV files of one locale into one PO file, and keeps existing translations.
Users created with a password never get a forced reset
Users created with a password through the API or data import fall back to the account's creation date for the reset date, so the forced reset applies to them.
Employee Overview dashboard and simpler New Employee dialog
Adds an Overview tab to Employee with pay, attendance, leave and pending-items figures, and a simpler New Employee dialog.
Validate goal start and end dates
Passes the field names to the date validator, so goals with an end date before the start date are rejected.
Restore add button for users without a linked employee
Users with create permission but no linked Employee get the Add button back on Employee Checkin.
Call any deal contact from its options menu
Adds Make a Call to each contact's menu on the deal side panel.
User availability status
Users set Active, Away, Unavailable or custom status, shown on avatars, and assignment rules favour available users.
Paging, missing inputs and fixes for scripts that use the API (backport #3062)
Home page lists take start and limit_page_length, so scripts can read past the first page.
Add the frappe-learning agent skill, and let frappectl reach Learning methods (backport #3079)
Backport of #3079.
Add the frappe-learning agent skill, and let frappectl reach Learning methods
Adds an agent skill for managing a Learning site, and lets frappectl call Learning methods.
Fit the new course form, allow beautifulsoup4 4.15, and let Mergify open conflicting backports
The new course form fits a laptop-sized window, so the description editor is no longer cut off.
Open the newest question, show lesson tabs on first load, and publish releases to the marketplace
The Community tab opens the newest question, and lesson tabs show on a direct first load.
Store course reviews as plain text and print them as text
Reviews are stored as plain text with tags stripped, and the Multiple Testimonials block prints them escaped, so review markup no longer reaches the public page.
Stop invoice dialog request loop on snapshot lines
Invoices with two or more snapshot lines no longer send requests forever, so the item table shows.
Let onboarding tests run on Frappe v16
Lets the onboarding tests mock a function that exists only on develop, so they run on v16.
A click reads again only what it changed, and opening a thread waits on nothing
Opening a thread no longer waits on user and mailbox reloads, and a write re-reads only what it changed.
Move only the affected subtree on reorder
Moving a page updates only its subtree and rejects moves under its own child, instead of rebuilding every page on the site.
Add a toggle to turn off PDF download
Adds an Allow PDF Download switch in space access settings; when off, the Download action is hidden and the endpoint returns 403.
Explain drain failures and start a drain from the Metal Server form
Shows why a drain migration failed and starts a drain from the Metal Server form.
Drain a Metal Server
Adds a tracked drain operation that moves every VM off a Metal Server with limited, parallel migrations.
Add x markers, line options and donut onClick
Adds vertical x markers, per-dataset line options including dashed and gap handling, and a donut click handler.
Progress bar on NumberCard
Adds an optional progress bar to NumberCard, drawn from a caller-supplied percentage.
Calendar heatmap, percentage bar, and what desk needs to drop frappe-charts
Adds the calendar heatmap and percentage bar charts that Desk needs in order to drop frappe-charts.
Bookmark comments, and open the bookmarked post from Bookmarks
Any comment can be bookmarked, and the Bookmarks list opens the saved post.
Send Suite's emails from Suite Cloud templates
Adds a Suite Cloud endpoint that renders and sends Suite's fixed catalog of emails from its own templates.
Unsubscribe from a list beside the sender, held for Undo
Shows an Unsubscribe action beside the sender of mail with a List-Unsubscribe header, with Undo available.
Ask Suite Cloud for Suite's emails by type (backport #1029 to #881)
Backport of #1029 onto the Drive layer branch.
Ask Suite Cloud for Suite's emails by type
Suite's emails are requested from Suite Cloud by type, so the site no longer needs its own sender.
Y.Doc schema for collab, with row/col id lists and a size benchmark
Defines the shared Sheets document layout and a size benchmark; nothing is wired to the editor yet.
Robust telemetry and failure points
Adds telemetry and failure-point metrics for the garage work.
Configure garage gateway & storage to send logs via vector
Sends gateway and storage logs through vector, redacts signatures, and drops sync and health-ping noise.
Remove --chmod from COPY instructions for podman compatibility
Moves group permission changes into the builder RUN step, so Podman and Buildah images build.
Hide AI page actions in non-public spaces
Hides Open in ChatGPT and Open in Claude on spaces guests cannot read, since those services cannot fetch the page.
Autosave while typing
Autosaves 2 s after typing stops, with a 10 s maximum wait, so nonstop typing also saves.
Show the recipient in a Suite email's To header
Suite emails sent straight from Suite Cloud show the recipient in the To header, not a placeholder.
Toasts say so on the click, and the sidebar rings what has focus
Mail action toasts appear on click, and a refused write removes its toast and says why.
Mail read in the Unread filter stays on the list until the list changes
A conversation read in the Unread filter stays on the list until the folder, filter or tab changes.
The sender card lists, and View all finds, what the sender has sent
The sender card lists mail from that sender, and View all searches for the same.
Undo and failures put back all they took, unsubscribing stays done, and filtered lists keep to their filter
Undo and failed actions restore everything they took, unsubscribes stay done, and filtered lists keep their filter.
Do not show administrator and blur issue on Safari
Fixes the Administrator label and blur issue on Safari.
Accept bare log array as well
Datum accepts a bare log array, not only an object wrapping one.
Update fluent-bit to cap pushes and refused request log
Caps fluent-bit pushes and the refused-request log, referencing datum #19.
Send the Datum branch as branch in the telemetry config
Telemetry sends the Datum branch under the name Cargo now uses; Cargo's change must merge first.
A key's own limit rows replace the tier's per metric, not wholesale
A key that pins only some limits keeps the tier's other limits, such as total tokens.
Round a fractional disk up for resize
Resize config rounds a fractional disk up to whole GB, so a resize no longer fails on a 12.5 GB disk.
Set the tab title once when the page mounts
Sets the tab title once on mount, which closes studio #318.
Tag-size chips, no empty suggestion list
Recipient chips use the tag size, and the suggestion list opens only when it has something to show.
Allow frappe v15 and above
Relaxes the frappe pin to `>=15.0.0`, so main deploys on v15 benches pass the dependency check.
Import BaseDocument from base_document
Fixes bench migrate failing with an ImportError when Jinja hooks load after Frappe moved BaseDocument.
Add missing permission checks to wiki endpoints
Adds read checks to change request diffs, listings, breadcrumbs and the space route list, requires Approved status to retry a merge, and limits external links to http, https and mailto.
Restrict revision doctypes to managers
Wiki User and Approver roles lose direct REST access to revision tables, and the change request code writes them itself.
Only the owner can edit a profile, admins included
Only a profile's own user can edit it; Gameplan admins can still create, delete and manage roles from Settings.
Tighten search filters, comment reindex on move and draft commit targets
Search accepts only the filters the search page offers, comment search entries follow their discussion to a new space, and drafts can be committed only to the document they were written for.
Tighten invitation lifecycle
Invitation links work once, opening one never signs in an existing account, onboarding runs only on a new site, and admins manage invitation records.
Save child rows through their parents and check space communities on every save
Child rows such as poll votes and members can be saved only with their parent, and a new space starts with its creator as the only member.
Scope guest access, activity, search feedback, follows and tags to the people they concern
Limits who can read or delete these records to the people each one concerns, and lets only the server change the records it writes.
Apply row and field permissions in list endpoints
Gameplan's own list endpoints apply Frappe's row and field permission checks, so each user sees the same rows and fields as the standard API.
Use stored documents for controller actions
Controller actions reload the document from the database and check read access first, instead of trusting a copy sent by the browser.
Monday, October 19
Carry reserved serial and batch to delivery note row fields
A Delivery Note made from reserved serial or batch stock now fills the row fields, so submit no longer fails with "Serial and Batch Bundle None not found".
Validate payment mode accounts and enabled status
Mode of Payment default accounts must be cash or bank, not group, income, payable or disabled, and disabled modes are rejected on transactions.
Correct the dunning letter example
The Dunning Type letter example uses fields that no longer exist, so copied placeholders now resolve to invoice details.
Show rates in the item price's currency in Item Price Stock report
Buying and Selling Rate columns use each Item Price's own currency instead of the default currency.
Skip the source discount when no rows are added (backport)
Backport of #61296.
Skip the source discount when no rows are added
When an order adds no rows to a receipt, its header discount is cleared, so it no longer applies to the receipt's existing rows.
Convert returns to sales order UOM in order progress (backport)
Backport of #60569.
Convert returns to sales order UOM in order progress (backport)
Backport of #60569.
Convert returns to sales order UOM in order progress
Returns are converted to the Sales Order's UOM, so delivered, returned and billed quantities on the order are correct.
Convert returns and credit notes to delivery note UOM when invoicing (backport)
Backport of #60570.
Convert returns and credit notes to delivery note UOM when invoicing (backport)
Backport of #60570.
Convert returns and credit notes to delivery note UOM when invoicing
Returns and credit notes are converted to the Delivery Note's UOM, so Create Sales Invoice offers the correct remaining quantity.
Leave order-neutral debit notes out of billed qty (backport)
Backport of #61336, also including the invoice return fix from #60571.
Leave order-neutral debit notes out of billed qty (backport)
Backport of #61336, also including the invoice return fix from #60571.
Leave order-neutral debit notes out of billed qty when making a Purchase Invoice
Make Purchase Invoice no longer subtracts debit notes that do not update the Purchase Order.
Convert receipts, returns and debit notes to purchase order UOM (backport)
Backport of #60571, the same change as #61285 on another branch.
Convert receipts, returns and debit notes to purchase order UOM (backport)
Backport of #60571, converting received, returned and billed qty. Receipts now count by stock when only the conversion factor changes.
Convert receipts, returns and debit notes to purchase order UOM
Receipts, returns and debit notes are converted to the Purchase Order's UOM, so received, returned and billed quantities match the order.
Sales Person-wise Transaction Summary: closed-document double-counting
Closed documents no longer double-count amount and total.
Sales Person Commission Summary: group sales person filter and amount total
Fixes the sales person filter grouping and the amount total.
Sales Partner Transaction Summary: account for return entries by default (backport)
Same change as #61119 on another branch.
Sales Partner Transaction Summary: account for return entries by default
Return entries are included by default in the report.
BOM Operations Time report bug fix
Fixes the sub-assembly BOM count, which counted draft and cancelled parents and repeated rows.
BOM Variance Report bug fixes
Shows real variances, not only extra output, for Work Orders that consumed more material than planned.
BOM Stock Analysis report bug fixes
A material used directly and inside a phantom BOM is no longer checked twice against the same stock.
Cost of Poor Quality Report bug fixes
Job Cards are costed only for the periods they fall in, not their full cost in every period they touch.
Exponential Smoothing Forecasting report bug fixes
Stops the forecast from shrinking toward zero in future periods.
Production Plan Summary report bug fix
Process loss on a completed Work Order no longer shows as pending.
Production Planning Report bug fixes
Required Qty is now in the stock unit of measure, matching stock and open Purchase Order quantities.
Quality Inspection Summary report bug fixes
Fixes a KeyError that made the report fail when an inspection has status Cancelled.
Work Order Summary report bug fixes
Work Orders planned to start later are now listed.
Work Order Stock Report bug fixes
Multi-level Work Orders are checked against their exploded raw materials, not the BOM's own lines.
Work Order Consumed Materials report bug fixes
Returned Qty is now converted to the stock unit of measure, like the other quantity columns.
Work Orders in Progress report bug fix
Completed Work Orders with process loss no longer stay listed as in progress.
Itemwise Recommended Reorder Level report bug fixes
Components delivered through Product Bundles are now counted in consumption.
Downtime Entry bug fixes
Overlapping downtime entries for the same workstation are now rejected.
Delivery Note review follow-ups
Fixes the creditable quantity for credit notes after a reduced-rate invoice.
Pick List review follow-up
Submitting a changed Pick List now recalculates its stock quantity and conversion factor.
Serial and batch fixes for subcontracting inward returns (backport)
Picks only the pending batch qty when returning customer material and matches consumed serial and batch entries by serial number.
Combining documents keeps each source's discount
Each row carries its source's additional discount, so combining documents no longer applies the last source's discount to every row.
Subcontracting Order and Subcontracting BOM bug review fixes (backport)
Backports the Subcontracting bug review fixes, including refusing draft BOMs on subcontracting rows and requiring an active, submitted Finished Good BOM.
Project material cost counted once
Stock bought or manufactured for a project is no longer counted twice in gross margin, and Delivery Note stock is now counted.
Manufacture and Repack outputs carry exactly the consumed value (backport)
Backport of #60393.
Manufacture and Repack outputs carry exactly the consumed value (backport)
Backport of #60393.
Manufacture and Repack outputs carry exactly the consumed value
Finished goods are valued to the exact value consumed, so the 0.01 difference no longer goes to Stock Adjustment.
Repost Item Valuation review follow-up
A resumed repost no longer skips reposts queued while it was running.
COGS By Item Group report bug fix
Counts a stock movement as COGS only when it posts to the COGS account, not every movement in a voucher that touches COGS.
Incorrect Serial and Batch Bundle report bug fixes
Stops listing bundles of unconsolidated POS Invoices as incorrect.
Stock Analytics report bug fixes
Fixes 4 bugs, starting with periods before the first movement showing 0 instead of the opening balance.
Production Plan bug fixes
Fixes 13 Production Plan bugs, starting with consolidating two orders giving two rows with the combined quantity.
BOM Creator bug fixes
Fixes 13 BOM Creator bugs, starting with a sub-assembly used in two branches being costed with both sets of raw materials.
Material Requirements Planning Report bug fixes
Fixes 10 report bugs, starting with raw material quantity ignoring the BOM quantity.
Master Production Schedule bug fixes
Fixes 5 bugs, starting with To Date being overwritten on every save.
Blanket Order bug fixes
Fixes 9 Blanket Order bugs, starting with Update Items raising a submitted order past the Blanket Order quantity.
Material Request bug fixes
Fixes 11 Material Request bugs, including non-Purchase requests from a Sales Order not updating the requested quantity.
Purchase Receipt bug fixes
Fixes 11 Purchase Receipt bugs, including rejected quantity being subtracted from returns when the setting is off.
Item bug fixes
Fixes 12 Item bugs, starting with merging items dropping the target's reservations.
Stock Reservation Entry bug fixes
Fixes 14 bugs in Stock Reservation Entry and sets the company on the Serial and Batch Bundle built for reserved deliveries.
Job Card bug fixes
Fixes 19 Job Card bugs, including sub-operations with two operators halving the completed quantity.
Work Order bug fixes
Fixes 15 Work Order bugs from the bug review, including Closed and Stopped orders reverting to In Process when a Job Card is cancelled.
Production Analytics report bug fix
Work Order counts in the report now respect User Permissions.
Correct payment cancellation and reject negative amounts
Cancelling a payment restores the payment schedule's company-currency balance instead of subtracting it again. Internal Transfers no longer accept negative amounts or exchange rates.
Keep balances within the requested finance books
Account balances no longer add entries from every finance book when no book is selected, so they match General Ledger and Trial Balance.
Search and notifications on the dock
Adds search and notifications to the dock on the version-16 hotfix branch, backported from #44436.
Compare saved timestamps as datetimes (backport)
A document inserted at a whole second can be saved and submitted again, instead of raising TimestampMismatchError.
Preload logger before forking worker pool
`bench worker-pool` no longer hangs when a job starts while a worker's scheduler is first importing the logger.
Chrome pdf and print view bugs from open issues
Chrome no longer keeps running when `chromium_path` is a wrapper script, `@page size` sets the PDF size, and Report Builder print gets the Include filters option.
Failed chromium start adds a misleading error log
Cleanup disconnects the browser session only when one was opened, so the misleading AttributeError log is gone.
New announcement stays hidden for users who closed the previous one
A changed announcement clears the old dismissed flag before the navbar is drawn, so it shows on the first reload.
Desk links break for documents with # or ? in their name
Desk form links escape # and ? in the document name, so they open the right document.
Portal links break for documents with # or ? in their name
Web form and portal links encode the document name, so names with # or ? no longer open "Page not found".
Added columns overwrite same-named columns in export
Added report columns with the same name as an existing column no longer put their value in both.
Export keeps the sort order after filtering a column
Column filters no longer reset the visible row order, so export matches the sorted report on screen.
Keep the sidebar toggle working when the window is resized
The small-screen sidebar closes when the window gets wide, and Toggle Sidebar opens it even if it was hidden before.
Show Edit for properties that have a control in More Styles
The More Styles picker shows "Edit" for properties that have their own control, which scrolls to and focuses that control.
Insert the File before patching generate_file_name
Inserts the File before the patch, so the mock doesn't bind for the rest of the run and fail six server tests.
Tune MemoryHigh, MemoryMax & Innodb Snapshot Isolation
Lets MariaDB memory limits be updated, raising them up to 90% of projected total RAM.
Central Team and policy-bearing API keys
Introduces Central Team as the ledger, and API keys that carry geography, groups, allow/deny lists, rate limits and a spend cap that keeps the team's balance covered.
Keys carry their geography and cap
Team AI keys carry a geography and a spend cap, with an overview of balance, unallocated amount and this month's usage.
Free-row merge patch runs again, without the billed column
Fixes a data patch so the free-row merge runs once and without the billed column.
Stepper classes and docs
Stepper's classes are scanned for Tailwind, and its docs build from `frappe-ui/experimental`, unblocking main.
Sunday, October 18
Inventory Dimension review follow-up
A backdated issue is no longer refused because of a later transfer within the dimension.
Workstation Type bug fixes
Type-only operations skip disabled workstations.
Manufacturing Settings bug fixes
Time Between Operations of 0 is no longer read as 10 minutes.
BOM bug fixes
Ten BOM fixes, including Update Cost no longer saving unsaved form changes.
Available Batch Report bug fixes
fix(stock): Available Batch Report bug fixes
Available Serial No report bug fixes
fix(stock): Available Serial No report bug fixes
Batch Item Expiry Status report bug fixes
Batches are filtered by expiry date, not the creation date of the Batch record.
Delayed Item Report bug fixes
Sales returns are no longer listed as late deliveries.
Delayed Order Report bug fixes
An order delivered in parts is judged by its last delivery.
FIFO Queue vs Qty After Transaction Comparison bug fixes
fix(stock): FIFO Queue vs Qty After Transaction Comparison bug fixes
Incorrect Balance Qty After Transaction report bug fixes
Differences below 0.5 are now reported.
Incorrect Stock Value Report bug fixes
fix(stock): Incorrect Stock Value Report bug fixes
Item Prices report bug fixes
Last Purchase Rate is per stock unit of measure, not per purchase unit.
Item Shortage Report bug fixes
fix(stock): Item Shortage Report bug fixes
Item Variant Details report bug fixes
Open Sales Orders excludes delivered and closed orders.
Item-wise Consumption report bug fixes
Material Transfers for Manufacture no longer count as consumption.
Landed Cost Report bug fixes
Filtered by a receipt, the cost shown is that receipt's share, not the whole voucher's total.
Material Requests without Supplier Quotations report bug fixes
Cancelled or draft Supplier Quotations no longer hide a request.
Product Bundle Balance report bug fixes
The Date filter is now applied.
Requested Items To Be Transferred report bug fix
fix(stock): Requested Items To Be Transferred report bug fix
Reserved Stock report bug fixes
Available Qty to Reserve is computed live rather than from the snapshot at reservation time.
Serial and Batch Summary report bug fixes
Group warehouses now return their child warehouses' bundles.
Serial No and Batch Traceability report bug fixes
fix(stock): Serial No and Batch Traceability report bug fixes
Serial No Warranty Expiry report bug fixes
The report shows Warranty Expiry Date instead of AMC Expiry Date.
Stock and Account Value Comparison report bug fix
The report no longer comes back empty when As On Date is cleared.
Items To Be Requested report bug fix
Disabled items are no longer listed.
Stock Ledger Invariant Check report bug fix
Show Incorrect Entries now catches wrong valuation rates.
Stock Ledger Variance report bug fix
fix(stock): Stock Ledger Variance report bug fix
Stock Projected Qty report bug fixes
Shortage Qty now accounts for quantity reserved for unconsolidated POS sales.
Stock Qty vs Serial No Count report bug fixes
fix(stock): Stock Qty vs Serial No Count report bug fixes
Warehouse Wise Stock Balance report bug fix
Stock in disabled warehouses is now included in parent totals.
Stock Ageing report bug fixes
fix(stock): Stock Ageing report bug fixes
Issued Items Against Work Order report bug fixes
Material returned to the store is no longer listed as another issue.
Stock Balance report bug fix
Warehouse Type is no longer ignored when a warehouse is also selected.
Warn about fieldname conflicts only when the dimension fieldname changes
fix(accounts): warn about fieldname conflicts only when the dimension fieldname changes
Validate... / fix(accounts): Accounting dimension fieldname conflicts
The fieldname conflict warning appears only when the dimension's fieldname changes, not on every re-save.
Keep the visitor session and site host on appointment verification
Appointment verification keeps the visitor's session and builds links from the site host.
Ignore cancelled gl entries when comparing voucher entries during repost
fix(accounts): ignore cancelled gl entries when comparing voucher entries during repost
Preserve pricing discounts on quantity changes
Changing quantity keeps the pricing rule discount instead of resetting to the Price List Rate.
Combine balances of groups sharing an account type
Groups with the same Account Type are summed rather than the last one overwriting the rest.
Validate POS profile write-off settings
Write-off accounts and cost centres must be ledgers of the same company.
Rate limit appointment slot lookups on the booking page
Rate limits `get_appointment_slots` on `/book_appointment`.
Permissions, credit notes, Closed orders and modernization in Inactive Customers report
fix: permissions, credit notes, Closed orders and modernization in Inactive Customers report
Pending qty, request matching and user scope in Pending SO Items for Purchase Request report
fix: pending qty, request matching and user scope in Pending SO Items for Purchase Request report
Pending qty, request matching and user scope in Pending SO Items for Purchase Request report
fix: pending qty, request matching and user scope in Pending SO Items for Purchase Request report
Pending qty, request matching and user scope in Pending SO Items for Purchase Request report
Restricted users only see their own permitted Sales Orders, and delivered quantities are subtracted from pending.
Sales Order Analysis permissions, closed orders, credit notes and warehouse filter
fix: Sales Order Analysis permissions, closed orders, credit notes and warehouse filter
Correct permissions, closed orders, credit notes and warehouse filter in Sales Order Analysis
Stops restricted users seeing other customers' orders through the chart and Group by Item, and fixes pending figures for Closed orders.
Item Price Stock report bug fixes
Users without Item Price read access no longer see buying and selling prices.
Warehouse wise Item Balance Age and Value report bug fixes
Warehouse columns and totals are limited to warehouses the user can read.
Total Stock Summary report bug fix
Group By Company totals no longer add in warehouses the user cannot read.
Store imported supplier invoice XML as private file
The XML extracted during Supplier Invoice import was attached as a public file; it is now private.
Check asset read permission when fetching a depreciation schedule
Backport of #59883 to version-15.
Check asset read permission when fetching a depreciation schedule
Backport of #59883 to version-16.
Don't delete frappe.local.sites_path in realtime config test
Fixes a test that broke every later server test module on CI.
Serve on the socket systemd passes, across restarts
Runners keep their listening socket open across restarts, so requests queue instead of getting 502s.
Add line numbers for strings from JSON files
POT entries from DocType, Report and Workspace JSON now point to their exact line.
Page background, paper size and orientation in the print format editor
feat(print): page background, paper size and orientation in the print format editor
Page background, paper size and orientation in the print format editor
Adds a page background image with opacity, and saved paper size and orientation, to print formats.
Storage v2: content-addressed blobs, pluggable storage backends, and signed file URLs
Alpha, behind a `storage_v2` site setting: each upload is stored once as a File Blob, regardless of attachment count. Apps outside Suite should not build on it yet.
Bulk delete failure lists names without a reason
The bulk delete dialog gives the reason for each document that could not be deleted.
Read notification shows as unread again after a reload
The notification list is fetched fresh, not from the browser cache.
Answer client acknowledgements with the handler result
Acknowledgements from the Python realtime server now return the handler's result, as the Node server does.
Find sites from inside the sites folder
The standalone realtime server finds sites when started from inside the sites folder.
Password changed in desk still forces a reset at login
A password changed in desk now counts as a reset, so the expiry is cleared.
Add roles does nothing for a user created outside the form
The Add Roles button opens the user's form on the roles tab, from the list and from the form.
Count connections per link field when a doctype is linked twice
Connection counts follow each link field, so a record isn't dropped or double-counted.
Query string redirects stop working after a visit without one
Requests skip the "no redirect" cache so query-string redirect rules keep matching.
Logging out shows the session expired dialog
Logout no longer shows a Session Expired dialog before the login page.
Translated template headers stop matching their fields
Column header maps are cached per request, so templates in another language import correctly.
Drop saved group by fields that cannot be queried
Reopening a Report view saved with "Group By: Comments" no longer fails and stays empty.
Stray closing tag when announcement can't be dismissed
Moves the close button's closing tag inside the same `{% if %}` as its opening tag.
Setup wizard fails on servers without deprecated timezone names
Picking India no longer preselects `Asia/Calcutta`, which newer Debian and Ubuntu releases don't ship.
Cached hook lists keep growing on every route cache miss
Route cache rebuilds stop appending to the cached `website_generators` and `website_route_rules` lists.
RQ Job list fails to load after a queued function is renamed
Jobs whose function no longer imports are skipped during matching, and the RQ Job list shows them so they can be deleted.
Multiselect fields still suggest values already picked
The dropdown skips values already picked, in both pills and the comma-separated multiselect.
Second message in a dialog hides the first message's action button
A message without an action no longer hides a button set by a message still on screen.
Add the Bluebird team to its private spaces
fix(demo): add the Bluebird team to its private spaces
Compress memory and disk migration transfers
Memory snapshots are zstd-compressed and disk blocks are sent as ZFS stores them, cutting VM downtime during migration.
Add Metal Server Console to run a script on many hosts
Runs one shell script as root across many Metal Servers at once, with live output per server.
Answer the custom-domain pre-authorize check with the zone
Lets Central check that custom domains point at the region, including domains behind a CDN.
Choose SSH or TTY for the web console
Members pick SSH or the serial console; Central no longer switches between them on its own.
Host Suite sites on Frappe Cloud through Central and Pilot
Adds a Hosting module that provisions servers and sites in Central, with a pool of ready sites per region.
App-declared processes and restarts without 502s
Apps can declare background processes in `pyproject.toml` that the bench runs alongside their site.
Leave checked rows unfilled, report the highlight, name the list
fix(frappe-ui multiselect): leave checked rows unfilled, report the highlight, name the list
Make sorting work in both directions
Sorting runs on the client, column headers sort on click, and a second click reverses the order.
Feat(metal) / fix(atlas): Recover VM migrations from memory and temporary failures
Migrations survive short failures, fall back to a disk-only move when memory can't move, and can't get stuck with the VM stopped.
Fetch an update target without its history in a shallow clone
Shallow clones fetch only the target commit, so the update check stops timing out on large repos.
Allow database settings without bench management
Database settings such as restart and buffer pool no longer require bench management; process kill and binlog purge stay gated.
Keep the database enabled, build frappe's assets in init, and keep the web socket open on restart
Database units stay enabled after a retried init, and restarts keep the websocket open.
Pre-authorize... / fix(signups): close the gaps between free trials and billing
Closes six gaps: restarting trials after a left trial, teams with unpaid invoices opening free servers, and trial servers not sleeping in production.
Pass the marketplace security scan
Clears the 11 Critical and Major findings that blocked the marketplace release.
Saturday, October 17
Embed only quotation fields on the RFQ portal page
The supplier RFQ portal page embeds only the fields the quotation form uses.
Fetch only displayed columns in portal project list
The portal project list fetches only the columns it shows.
Remove demo account from Philippines chart
Removes the "Raw Materials - Demo" account, so new companies no longer get it in their production chart.
Clean file name and escape values in code list import
The file name of an imported Genericode file is cleaned before it is saved.
Save edited notes through the document
Edited CRM notes are saved through the document, the same way adding and deleting notes works.
Item dashboard add dialog rate (backport)
fix: item dashboard add dialog rate (backport)
Item dashboard add dialog rate (backport)
fix: item dashboard add dialog rate (backport)
Item dashboard add dialog rate
The Rate field in the Add dialog is prefilled, and an empty rate no longer fails Create Stock Entry.
Fetch buying exchange rate in supplier quotation (backport)
fix: fetch buying exchange rate in supplier quotation (backport)
Fetch buying exchange rate in supplier quotation (backport)
fix: fetch buying exchange rate in supplier quotation (backport)
Fetch buying exchange rate in supplier quotation
Supplier Quotation uses the buying rate and POS Invoice uses the selling rate, instead of the latest rate of either type.
Refresh exchange rate on auto-repeated documents
Auto Repeat fetches the exchange rate for the new posting date. If no rate is found, it stops the schedule and notifies the owner.
Bound link option results in ar, ap and gl report filters
The Party filter loads a bounded set of options, so the browser no longer freezes on large customer lists.
Match special-character filters, update codes on re-import, report rows
Import filters containing & or apostrophes now match, re-imports update existing codes, and row results are reported.
Average calendar time and add a company filter
Averages calendar time only, instead of mixing it with SLA working time, and adds a company filter.
Require a positive default factor and allow editing the default
Shift-based schedules need a positive default factor, and the default can now be edited.
Restore schedule on cancel and keep booked entries
Cancelling an allocation restores the previous depreciation schedule and keeps entries already booked.
Respect As on Date, fix returns and list asset receipts
Uses the As on Date for billing and returns, and lists asset receipts.
Respect as on date, debit notes and service rows
Uses the As on Date for receipt and billing, and handles debit notes and service rows.
Preserve opening invoice balances
Opening invoices convert the entered company-currency amount into the party's currency, instead of posting the raw amount.
Validate bank ledgers and exclude disabled defaults
A Company Bank Account must link to a Bank ledger of its own company, and a disabled account cannot stay as the default.
Preserve forward trace direction
Forward traces keep their direction, instead of marking positive finished goods as Backward.
Include sales invoice qty in recommended reorder level
Delivered quantity now includes Delivery Notes and Sales Invoices with Update Stock, so the reorder level is not understated.
Filter batch expiry by report date
Available Batch Report excludes batches that expired before the selected date, not only when the date is today.
Correct serial number status report columns
Serial No Status shows a Status column, so Delivered and Consumed serials can be told apart.
Use opening history in Incorrect Serial No Valuation
Serials received before the period count toward the opening, so they are no longer flagged as incorrect.
Filter BOM search status and retain direct sub-assembly matches
Draft and cancelled BOMs and Product Bundles are excluded. Direct sub-assembly matches stay in the results.
Reset sales order advance paid on unreconcile
Unreconciling an advance resets the Sales Order's Advance Paid amount.
Validate inclusive referenced tax rows
Inclusive On Previous Row Total taxes now check the referenced row, so item rates match net amount plus included taxes.
Block disabling payment methods used by POS profiles
Disabling a Mode of Payment is blocked when a POS Profile uses it. The check previously looked in the wrong table.
Apply user permissions in payment ledger report
fix: apply user permissions in payment ledger report
Permissions, credit notes, Closed orders and modernization in Inactive Customers report
fix: permissions, credit notes, Closed orders and modernization in Inactive Customers report
Permissions, credit notes, Closed orders and modernization in Inactive Customers report
Enforces territory and customer group permissions, ignores credit notes when judging orders, and prorates partly delivered Closed orders.
Open the banking page only for desk users
fix(accounts): open the banking page only for desk users
Check sales order read in get_work_order_items
fix(selling): check sales order read in get_work_order_items
Check document access in SLA reset and payment reference count
Resetting an SLA requires write access to the document, and the payment reference count requires read access to the voucher.
Apply read permissions in Item Where Used report
Lists only BOMs, Product Bundles and other documents the user can read, and checks read permission on the selected Item.
Correct warehouse capacity sorting and permissions
Sorting covers all rules instead of one page, Putaway Rule and Item permissions apply, and a nonexistent parent warehouse no longer raises a TypeError.
Respect stock summary permissions and warehouse groups
Stock Summary honours Item User Permissions. Selecting a group warehouse shows stock from its child warehouses.
Restrict sales partner summary reports to permitted companies
fix: restrict sales partner summary reports to permitted companies
Restrict sales partner summary reports to permitted companies
fix: restrict sales partner summary reports to permitted companies
Restrict sales partner summary reports to permitted companies
The Sales Partner Commission and Transaction Summary reports now include only companies the user may access.
Permissions, duplicate reasons and value split in Lost Quotations report
fix: permissions, duplicate reasons and value split in Lost Quotations report
Permissions, duplicate reasons and value split in Lost Quotations report
fix: permissions, duplicate reasons and value split in Lost Quotations report
Permissions, duplicate reasons and value split in Lost Quotations report
Figures are limited to quotations the user can see. A value counts once per reason and is split evenly across reasons, so Lost Value % sums to 100%.
Sales Order Analysis permissions, closed orders, credit notes and warehouse filter
fix: Sales Order Analysis permissions, closed orders, credit notes and warehouse filter
Correct achievement, permissions and sales team scope in item-group target variance reports
fix: correct achievement, permissions and sales team scope in item-group target variance reports
Correct achievement, permissions and sales team scope in item-group target variance reports
fix: correct achievement, permissions and sales team scope in item-group target variance reports
Correct achievement, permissions and sales team scope in item-group target variance reports
Overall targets now count the holder's sales. Achieved figures respect the user's company, customer and territory permissions. The Sales Team join is limited to its parent doctype.
Validate permission and company of reference document
Checks read permission and company of the reference document when a Payment Request is saved.
Restrict reference doctype, print format and resend email
Restricts the reference DocType and print format of a Payment Request. The resend payment email uses the saved values.
Resolve portal customers from portal users
Issue and Timesheet portal lists use the Customer's Portal Users, like the document view. Portal document checks apply only to Customer and Supplier users.
Return only displayed fields in portal transaction list
Portal quotation, order and invoice lists fetch only the fields each row shows, not whole documents.
Mobile shell
On phones the desk shows a bottom tab bar and a navigation sheet from the page title, instead of the sidebar drawer.
Add a built-in MCP server
Adds a /api/v2/mcp endpoint with 15 tools for reading and changing documents and calling whitelisted methods. It reuses Frappe's permissions, and MCP Settings control it per site.
Move the page-island toolchain out of ui/
Moves the toolchain beside ui/, so copying sites/assets with symlinks no longer fails on a cyclic link.
Allow localhost redirect URIs for dynamic clients
MCP clients such as Claude Code can register http localhost redirect URIs on sites outside developer mode.
Compare saved timestamps as datetimes (backport)
A document inserted at a whole second can be saved and submitted again.
Rename param retry to rq_retry in frappe.enqueue
The retry value was passed to RQ instead of the queued method, so resetting a user's OTP secret failed before the email was queued.
Go back past a new document after it is saved
Back after saving or renaming a new document goes to the previous page, not the same document.
Add fallback perm. check in absence of doc & name
fix(email): add fallback perm. check in absence of doc & name
Bind social-login state to the initiating browser
A short-lived HttpOnly cookie ties each social login state to the browser that started the login.
Sanitize and bound web_search inputs
fix(global_search): sanitize and bound web_search inputs
Canonicalize and confine print image thumbnail paths
Print image thumbnail paths are resolved and must stay inside the allowed folder.
Only ignore user permissions through a field the user can type in
fix(search): only ignore user permissions through a field the user can type in
Say when a search or filter matched nothing
An empty search result says "Nothing matches" and offers a Clear filters button, on Courses, Batches, Jobs and Programs.
Paging, missing inputs and fixes for scripts that use the API
Home page lists take start and limit_page_length, My batches can include past batches, and live classes return their batch and time.
Batch enroll button, reason when closed, and login redirect
Batches without a seat count show Register or Enroll, and the overlay explains why enrolment is unavailable. Guest login returns to the same page.
Batch page not-found state and Published badge for managers only
A batch the viewer can't see shows a Not Found page instead of a blank one, and the Published badge is shown only to managers.
Mark the invoicing consent checkbox as required
fix: mark the invoicing consent checkbox as required
Award badges to owner and skip manual ones on save
fix: award badges to owner and skip manual ones on save
Keep the settings dialog content within its width
fix: keep the settings dialog content within its width
Hide lesson progress for guests and explain locked lessons
fix: hide lesson progress for guests and explain locked lessons
Job logo fallback and relative times in the site timezone
fix: job logo fallback and relative times in the site timezone
Let quizzes without questions count as passed
fix: let quizzes without questions count as passed
Show a neutral note for unknown content blocks
Unknown lesson blocks show "This content is not available" instead of EditorJS's internal type name.
Floor quiz submission score at zero
With negative marking, a score can no longer go below 0.
Count only course lessons and cap progress at 100
Progress counts only lessons still in the course, so it can no longer exceed 100%.
Course page progress and certificate PDFs without letter head
The course card shows the learner's progress, and certificate PDFs render when the site's default Letter Head would fail.
Compare batch dates with getdate
Batch date checks compare dates on both sides, which fixes a TypeError on partial REST updates.
Return no results when the search index is missing
Ctrl+K search returns no results while the index is missing, instead of showing "Could not search just now" on every keystroke.
Fetch batch courses once the batch name is known
Batch courses are requested once the batch name is known, so moving between batches no longer keeps the old batch's courses.
Mark required sign-up fields
Full Name and Email on sign-up show a required marker, so users can see what the disabled button is waiting for.
Translate assessment type labels
The Quiz, Assignment and Programming Exercise labels in Add Assessment are now translated.
Check required fields before creating a record
New Course, New Batch and New Assignment check required fields first and name the missing one, instead of sending an empty form.
Course ZIP re-upload, chart ranges and guest access for statistics and jobs
A course ZIP can be re-imported when the same bytes were already uploaded by someone else. Chart ranges and guest access for statistics and jobs are also fixed.
Evaluator save and currency picker access
The evaluator on a member's open certificate request can now save it. Moderators keep their access.
Harden SSH, encryption key check, team 2FA and version log
Sets SSH MaxAuthTries to 4, runs the encryption key check that never ran, and records changes to access-related doctypes in the version log.
Add kamra to the registry
Adds Kamra PMS, a property management system built on Frappe v16, to the app registry.
One set of rules for Archive, Move, Junk and Trash
Archive, Move, Junk and Trash follow one set of server-side rules, so every view files a conversation the same way.
All Inboxes files by the same rules, with Unarchive
All Inboxes files mail by the same rules as a single account, with one Undo that restores every account's moves.
Search lists conversations, each opened on its newest match
Search lists one row per conversation, the way a folder does, and opening it lands on the newest matching message.
Settings-only configuration, tenant owners with the Suite Tenant role, optional tenant cluster
Reads all configuration from Suite Cloud Settings, adds a TLS check for the Stalwart API, and lets tenant owners use the Suite Tenant role.
Allow force app builds given the image
feat: Allow force app builds given the image
Integrate machine actions in cargo
feat: Integrate machine actions in cargo
Telemetry ping, garage node monitoring & clickhouse versioning
feat: Telemetry ping, garage node monitoring & clickhouse versioning
Build Pilot images for a 1 GB VM with swap and lean memory settings
Lets a Pilot bench with one site run on a 1 GB VM, by disabling unused services and adding a memory setup service at boot.
Polish the payment method and top up flows
Asks for the billing country first and adds a payment method where it is needed. Gateway failures show a message the customer can act on.
Trial to paid upgrade and plan change progress page
Trial users can upgrade from the console, and a public progress page follows a plan change until the site answers.
Let Pilots read private repositories through a GitHub App
Adds a GitHub tab in Central Settings. Pilots get a read-only token for one chosen repository, valid for about an hour.
Connect GitHub through Frappe Cloud
A Pilot managed by Frappe Cloud reads private repositories through the Frappe Cloud GitHub App, with no stored personal access token.
Change the site plan from the billing tab
Change plan opens an inline plan list in the billing tab. During a trial it shows when the welcome credit ends.
Pin the framework app to a commit on its branch
pilot init --commit checks out the framework app at a commit and keeps it on its branch.
Raise the x86 CPU baseline to x86-64-v3 and add a host setting to boot VMs without a CPU template
Guests on x86 hosts get the x86-64-v3 instruction set. An operator can boot a Metal Server's VMs without a CPU template.
Support dynamic tab title for pages
feat: support dynamic tab title for pages
Bump litellm to 1.95.0 for python 3.14 support
Benches on Python 3.14 can install the litellm pin, which previously had no matching package.
Check out shell scripts with LF line endings
Shell scripts are checked out with LF endings, so Windows checkouts no longer produce containers that fail with "no such file or directory" on the entrypoint.
Show commit labels when an update targets the branch tip
The update dialog shows commit hashes when the target is the branch tip, instead of registry versions that can look unchanged.
Read follow_branch from bench.toml when loading apps
The follow_branch setting in bench.toml is now honoured, so updates move the app to the branch tip.
Download prebuilt assets for a commit pinned behind its branch tip
A clean commit pinned behind its branch tip now downloads its prebuilt archive instead of building on the server.
Hide site skeletons during cached refreshes
Sites page shows skeletons only when nothing is cached. During a refresh the cached list stays visible.
Call Pilot over loopback from the site
Sites call Pilot on their own host, so Cloud Settings works on a new signup instead of failing with a name resolution error.
Initialise frappe at its commit with pilot init --commit
Image builds check out Frappe at the commit that has published prebuilt assets, so the VM no longer rebuilds them and runs out of memory.
Quoted text can be edited, and forwards and inline answers aren't trimmed
fix(mail): quoted text can be edited, and forwards and inline answers aren't trimmed
Quoted text can be edited, and forwards and inline answers aren't trimmed
The quote can be edited in place, forwards stay visible, and answers typed between quoted lines are no longer hidden.
Apple Mail quotes fold away, and only the sender opens their card
Apple Mail and Thunderbird quoted trails fold away again, and the empty space after the sender's address no longer opens their card.
Scroll menus that are taller than the screen
Dropdowns and context menus stop at the screen edge and scroll, so items at the end can be reached.
Make the code languages plugin work with Vite 8's dev server
Dependency pre-bundling no longer fails on Vite 8, so apps don't have to turn the plugin off.
Keep external content syncs out of undo history
Content set from outside no longer counts as an undo step, so Cmd+Z can't restore an empty document over a saved draft.
Let many people react to a post at once
Each reaction is its own row instead of a child row inside the post. Two people reacting at once no longer hit a TimestampMismatchError.
Separate visiting sites from admin login
Open site now goes to the regular site URL. Admin login is a separate action, so visiting no longer replaces the existing site session.
Restore a WireGuard address that NetworkManager removed
The apply script now checks that each address is still on the link and restores it if NetworkManager removed it, instead of exiting on an unchanged file.
Keep PCLMULQDQ in the x86 CPU templates
ClickHouse crashed with SIGILL on guests without PCLMULQDQ, so the x86 templates now pass it through and require it on the host.
Friday, October 16
Supplier Overview Dashboard
Adds an Overview tab to Supplier with KPIs, purchase and payment charts, payables ageing and recent transactions.
Keep each source's discount when combining documents
Each row keeps its source's additional discount, so combining documents no longer applies the last discount to every row.
Putaway Rule bug fixes
Keeps the rejected quantity on rows rebuilt by Apply Putaway Rule.
Sales Forecast bug fixes
Generated periods now start on From Date, so the first week or month is no longer skipped.
Stock Entry bug fixes
Fixes eleven Stock Entry bugs, including Repack, Material Issue and Disassemble cases.
Production Plan Schedule bug fixes
Editing a draft plan now replaces its old schedule instead of keeping stale workstation bookings.
Workstation bug fixes
Fixes six Workstation bugs, including Manufacture entry and split-shift scheduling order.
BOM Update Log bug fixes
Update Cost now completes when there is no leaf BOM, and fixes four other log bugs.
Bank Clearance Summary matches bank amounts
Matches bank amounts for taxed payments, POS and foreign invoices.
Deferred Revenue and Expense forecast past last fiscal year
Fixes a report failure when a service period runs past the last created fiscal year.
Accounts Payable Summary fixes
Adds the not-yet-due column to the party total and fixes GL balance and advance in summaries.
Calculated Discount Mismatch fixes
Lets accounts roles run the report and returns numeric amounts.
Asset Maintenance next due date, status, ToDos and deletion
Fixes an end date that blanked the next due date, plus In Maintenance status and ToDo handling.
Telephony Call Type search and submitted-only types
Fixes Call Type search in the incoming call popup and accepts only submitted Call Types.
Purchase Invoice Trends falls back to posting date
Invoices with no bill date now appear in the Billing Date view using their posting date.
Item-wise Purchase Register fixes
Includes other charges in the total, fixes child item groups, PO receipts and the percent-of-total column.
Use values passed to dialog primary actions
Removes redundant second get_values() calls in dialog handlers that caused false "Missing Values Required" errors.
Make the Set as Lost primary action use dialog values
Fixes a false "Lost Reasons missing" error on slow connections for Opportunity and Quotation.
Item-wise Sales History respects user permissions
Item-wise Sales History respects user permissions
Item-wise Sales History respects user permissions
Item-wise Sales History respects user permissions
Rename the builder to Print Format Editor
Rename the builder to Print Format Editor
Notify a user when someone else changes their password
Adds a bell notification for password changes made by someone else.
Leave the owner column out of report view exports
The Created By column that permission checks added to exports is removed from the file.
Read domains added with an SSL certificate in report PDF
Fixes a TypeError when exporting a Script Report to PDF on a site with an SSL domain.
Don't send password alert on second save of a new user
Social login no longer emails a "password changed" alert to every new user on the second save.
Short circuit websocket if in Frappe Cloud
Short circuit websocket if in Frappe Cloud
Short circuit websocket if in Frappe Cloud
Realtime no longer calls the web server back through the CDN for auth and room checks, which the CDN blocked.
Keep doctype sort order for empty link search
Link dropdowns with an empty search use the DocType's sort field and order instead of alphabetical order.
Fall back to document name when title field is empty
Fall back to document name when title field is empty
Don't count unsubscribed emails as newsletter recipients
Newsletters no longer stay on "Sending" forever when group members have unsubscribed.
Queue every bulk email before sending
Queue every bulk email before sending
Queue every bulk email before sending
Queue every bulk email before sending
Use values passed to dialog primary actions
Dialog actions use the values the dialog passes in, so "Missing Values Required" no longer appears when all fields are filled.
Select employee before advance account
Select employee before advance account
Expense claims: allow roles with write access to create claims for other employees
Expense claims: allow roles with write access to create claims for other employees
Data import page built on the new framework components
*(Listed under Refactors.)*
Shorter, consistent settings page descriptions and titles
Shorter, consistent settings page descriptions and titles
Group leads and deals into a summary with counts and totals
Adds a Group button to Leads and Deals list views with counts and aggregates, saved on the view.
Enrich button states, undo and enriched-field icons
Disables Enrich without a website, shows progress, and asks before re-enriching a record.
Data enrichment for Lead, Deal and Organization
Backports the data enrichment feature with its sitemap, settings and button changes.
Make kanban activity counts clickable in Leads and Deals
Clicking a count on a Kanban card opens the record on that tab.
Show users in email multiselect
The users list was always empty because a Pinia store value was destructured without storeToRefs.
Replace removed surface-modal tokens
Swaps removed tokens for surface-elevation-2 so grid rows and workflow error nodes are no longer transparent.
Use EmailMultiSelect from develop for email and user inputs
Replaces the old recipient inputs with the develop component, whose dropdown had a transparent background.
Keep lead notes visible in deal activity groups
Keep lead notes visible in deal activity groups
Make course and batch creation easier to find
Adds New Course and New Batch buttons beside their Import menus.
Let enrolled students open unpublished courses
Course detail no longer redirects enrolled students away from a course that was unpublished.
Nine small bugs surfaced by the test cleanup
Nine small bugs surfaced by the test cleanup
Validate json_value and keep the string null
Validate json_value and keep the string null
Validate json_value and keep the string null
Validate json_value and keep the string null
Send the storage limit notice to sites at 100% or more
Send the storage limit notice to sites at 100% or more
Don't chown Docker's data dir recursively
Don't chown Docker's data dir recursively
Mint the OAuth state on click and allow 30 minutes
Mint the OAuth state on click and allow 30 minutes
Correct OCI firewall attachment and detachment
Correct OCI firewall attachment and detachment
Keep asset store access out of the build
Keep asset store access out of the build
Add Stepper component
Adds a Stepper for ordered flows and jobs, with vertical, clickable and state options.
Add Datum token push and Cargo telemetry setup
Pushes a Datum token to Cargo so it can report its metrics, and rotates it.
Let agents configure site access
The agent guide now covers the auth commands, and agents log in with --oauth.
Create India-specific payroll configurations in job offer compensation
Adds EFP and ESI fields to the job offer compensation section.
Tighter thread view, list and sidebar
Tighter thread view, list and sidebar
Authenticate to Suite Cloud as a tenant
Replaces Suite Site with Suite Tenant, authenticated by id and secret.
Authenticate to Suite Cloud as a tenant
Suite Settings holds a tenant id and secret, and the client uses the Tenant authorization header.
Faster migrations
Adds an optional memory snapshot migration so running VMs resume their state; disk-only remains the default.
Backport observability and BMC telemetry
Backport observability and BMC telemetry
Monitor host hardware through the BMC
Reads BMC health, sensors and event logs over Redfish every 5 minutes and sends them to Datum.
Push Atlas and Metal telemetry to Datum
Sends host, VM, migration and error metrics to the regional Datum, and installs Vector on each host.
Move migration traffic from WireGuard to the private network
Migration traffic uses the private IPv4 address by default, with a setting to move it back to WireGuard.
Show the Vector install of Configure Telemetry as an SSH Task
The Vector install now runs as a visible SSH Task, and the button asks for confirmation first.
Add a Re-install Firewall action to Metal Server
Re-applies the host firewall without restarting metald.
Add an In Maintenance flag to Metal Server
Hosts marked In Maintenance get no new VMs while their existing VMs keep running.
Show the discussion sort dropdown in spaces too
Spaces share one saved sort preference with the community feed.
Skip the backup and migrate when no app change needs a migrate
Code- or asset-only updates skip the site backup and migrate, and only apps that need a migrate trigger one.
Install split for datum installation
Install split for datum installation
Open the matching Central page from each cloud settings link
Change plan, server logs and billing links now point to the right Central pages.
Do not count warm image units when a metald upgrade checks its VMs
Stops a metald upgrade from restoring the old build on healthy hosts because a warm image build unit looked like a lost VM.
Repair BMC power control and guard the VM migration network change
Supports BMCs that list reset types in ActionInfo and avoids a blocking BMC call on every Metal Server form load.
Announce a public address when a host claims it
Sends a gratuitous announcement so the provider router updates to the new host when a static public IP moves.
Cold boot a VM whose saved state no longer fits Firecracker
A saved state that differs only in Firecracker build or CPU template is treated as no saved state, so the VM cold boots after a metald upgrade.
Do not fail a kill when systemd only fails the auxiliary signal
A kill that systemd partly fails is treated as done, so stuck migrations in cutting_over can finish.
Release the VM lock of a migration that ended without settle
A VM locked by a migration that was hand-edited to a finished state is unlocked by the migration worker.
Undo brings back a draft's last edits and takes folder ticks back in All Inboxes
Undo brings back a draft's last edits and takes folder ticks back in All Inboxes
Reload screen when the IronCalc worker crashes
Shows a reload screen instead of freezing when the spreadsheet worker dies, since reloading restores the last saved copy.
Don't count unsubscribed emails as newsletter recipients
Don't count unsubscribed emails as newsletter recipients
Don't count unsubscribed emails as newsletter recipients
Don't count unsubscribed emails as newsletter recipients
Fix TLS, database sizing, realtime and task recovery bugs
Fixes a version-16 bench install failure, a lost site after a failed certificate, and several realtime and task recovery bugs found on a test VM.
Say "left" when the only admin removes themselves
The admin-handover system message now says the member left, not that they were removed by themselves.
Accept the self-signed certificate of a BMC
The Redfish client stops verifying BMC TLS certificates so requests succeed; password authentication stays, but TLS is no longer verified.
Student records access and SQL injection hardening
Stops students from reading other students' records and replaces SQL built with string formatting.
Recover VM migrations after host failures
Recovers committed memory migrations after the destination host is lost by recreating networking and cold-booting the current disk, and keeps failure causes and cancellation accurate.
Wednesday, October 14
Take back additional costs on Subcontracting Receipt returns (backport #59913)
Takes back additional costs on Subcontracting Receipt returns, so they are not spread over rejected rows again.
Quality Management bug review fixes (backport #59872)
v16 hotfix backport of the Quality Management fixes.
Quality Management bug review fixes (backport #59872)
Keeps scheduled quality reviews open until reviewed, creates one review per goal and day, and reviews quarterly goals on their date.
Keep Include Closed Orders out of the other trends reports (backport #59912)
v16 hotfix backport of the trends report fix.
Keep Include Closed Orders out of the other trends reports
The Include Closed Orders option applies only to its own report.
Translate document type labels in Sales Analytics "All" view (backport #60575)
v15 backport of the translation fix.
Translate document type labels in Sales Analytics "All" view
Document type names in the Sales Analytics "All" view are translated into the user's language.
Fixes for review findings on the maintenance and projects backports
A schedule where every day is a holiday is refused with a message, instead of putting visits on a holiday.
Skip schedule date reset when the doctype has no such field
Changing a Supplier Quotation's date no longer fails with "Field schedule_date not found" on v15.
Fixes for review findings on the projects backports
Set Project Status closes tasks without moving the planned dates of their dependents.
Buying Settings and Supplier bug review fixes (backport #59871)
v16 hotfix backport of the Buying Settings fixes.
Buying Settings and Supplier bug review fixes (backport #59871)
Applies blanket order allowance, skips receipt checks on returns and stock-updating invoices, and honours disabled suppliers.
Supplier Scorecard bug review fixes (backport #59869)
v16 hotfix backport of the Supplier Scorecard fixes.
Supplier Scorecard bug review fixes (backport #59869)
Validates scorecard formulas with zero variables and manual periods, and counts only submitted orders in late days.
Purchase reports bug review fixes (backport #59865)
v16 hotfix backport of the purchase reports fixes.
Purchase reports bug review fixes (backport #59865)
Includes child item groups in the purchase history filter, runs without dates, and counts analytics quantities in stock UOM.
Keep Procurement Tracker actual cost in company currency (backport #59911)
Keeps Procurement Tracker actual cost in company currency.
Procurement Tracker and subcontracting reports bug review fixes (backport #59868)
v16 hotfix backport of the Procurement Tracker fixes.
Procurement Tracker and subcontracting reports bug review fixes (backport #59868)
Lists every Purchase Order line, adds up every invoice in actual cost, and keeps unordered request rows.
Purchase Order bug review fixes (backport #59832)
v16 hotfix backport of the Purchase Order fixes.
Purchase Order bug review fixes (backport #59832)
Resets the Sales Order delivery on drop-ship cancel, refuses UOM changes on received rows, and links inter-company orders.
Follow-up fixes for the bug review PRs (backport #60280)
v16 hotfix backport of the follow-up fixes.
Follow-up fixes for the bug review PRs (backport #60280)
Counts packed qty on Delivery Note returns, treats empty project fields as unset on time logs, and checks BOM required qty per raw material.
Projects reports bug review fixes (backport #59863)
Groups issued items by project, counts update-stock invoices as delivered, and leaves cancelled and template tasks out of delayed tasks.
Timesheet bug review fixes (backport #59867)
Bills the right time logs, uses the timesheet currency and exchange rate, and computes amounts when no activity rate is found.
Projects masters and settings bug review fixes (backport #59864)
v15 backport of the projects masters fixes.
Projects masters and settings bug review fixes (backport #59864)
Checks activity cost uniqueness per employee, refuses disabled activity types and templates, and validates project template tasks.
Task bug review fixes (backport #59870)
Reschedules dependent tasks, allows timesheets outside expected dates, clears Overdue when dates move, and allows deleting subtasks.
Fix YouTube batch update and read video ids from all URL forms
The batch YouTube statistics update now writes to the Video it matches, and video ids are read from every URL form.
Export linked contacts and addresses with records
Customer and Supplier exports include their linked Contacts and Addresses, so the file can be edited and imported back.
Accept supplier invoice date objects
Accepts a date object for the supplier invoice date, so Purchase Invoices created from Purchase Receipts with a custom date field no longer fail.
Support favorite articles page views
Web Page View queries no longer join across databases, so favourite article page views work with SQLite log storage.
Filter Delivery Note list indicators on status
Clicking a Delivery Note indicator filters by status, not per_billed, so "To Bill" no longer also matches "Return Issued" notes.
Hide fully returned delivery notes in Get Items From (backport #60602)
v16 hotfix backport of the returned delivery note fix.
Hide fully returned delivery notes in Get Items From
Fully returned delivery notes no longer appear in Get Items From, which stopped batch invoicing with "already invoiced/returned".
Request for Quotation and Supplier Quotation bug review fixes (backport #59855)
Same supplier portal fixes on the v15 line.
Request for Quotation and Supplier Quotation bug review fixes (backport #59855)
Keeps draft and cancelled RFQs off the supplier portal, and builds portal quotations from the RFQ's own rows.
Add permission checks from the bug reviews (backport #59935)
Same permission checks on the v16 line.
Add permission checks from the bug reviews (backport #59935)
Applies permission checks to the Project Summary, Delayed Tasks Summary, Item-wise Purchase History and Purchase Order Analysis reports.
Check task read permission before listing its child tasks (backport #60152)
v15 backport of the child task permission check.
Check task read permission before listing its child tasks (backport #60152)
Checks read permission on the task before listing its child tasks.
Value, date and cancel consumed stock with the repair, keep asset status in sync
Consumed stock is valued from the Stock Entry's outgoing value, so the asset value matches the GL. Cancelling a repair also reverses its consumed stock.
Add automation canvas to framework ui
Moves the CRM workflow builder's flow canvas into the framework so any app can draw automation flows.
Add hover reveal cells
Cells marked for hover reveal show only on the hovered or focused row, and always show on touch screens.
Add SQLite-backed virtual DocTypes for log storage
Adds the log database connection and makes Error Log, Activity Log, Access Log, Route History and Web Page View virtual DocTypes backed by SQLite.
Keep distinct results when counting comments (backport #44391)
v15 backport of the distinct comment count fix.
Keep distinct results when counting comments
Distinct queries count comments only when they select the document's own name or *. Other distinct queries skip comment counting, so duplicate-looking rows no longer appear.
Pink, cyan and light blue indicators show as purple and blue
Pink and cyan states get their own colours, and light blue gets a lighter background than blue, so states can be told apart in lists.
Bulk delete skips selected rows on other pages
Bulk delete removes every selected row across pages, not only the rows on the current page.
Select all columns after unticking a shown column
In the column picker, Select All now ticks a column that was shown and then unticked.
Letter head dropdown cut off in the print sidebar
The print sidebar fills the window height, so Link dropdowns such as Letter Head show in full.
Email style with another format and font override check
Emailing with a different format uses that format's style and page settings. A non-text print font override is ignored instead of failing the print.
Email format and page count on the print page
Emails from the print page use the format and letter head picked there. The page count counts HTML formats that wrap each page in .page-break.
Close the empty help panel once onboarding status loads
Closes the Getting started panel once the saved onboarding status loads, if the user has already finished onboarding.
Give a new user a username when their first name is taken
A new user whose first name matches an existing username gets the next free name, such as krishna_kumar-1, instead of an empty Username.
Postion the anchor on right side for rtl
Positions the anchor on the right side in RTL layouts, so the datepicker opens in the right place.
Let a failed uninstall be finished by running it again
Re-running `bench uninstall-app` after a failure now finds the remaining modules and tables, so leftover tables are no longer orphaned.
Keep a new private page in the module it was made in
A new private page opens in the sidebar it was created from, and creating, renaming or deleting a workspace refreshes the list the router reads.
Open non-desk apps like CRM on their own page
Non-desk apps open in the same tab. Desk apps and full URLs work as before.
Let a title match its own module in another case
`bench migrate` no longer fails with "VAT Compliance is another module's name" when the sidebar title differs from the module name only in case.
Keep a converted sidebar off the dock of an app the site no longer has
Skips the sidebar conversion for apps the site no longer has, so `bench migrate` no longer stops at convert_custom_sidebars.
Keep a converted sidebar off the dock of an app the site no longer has (backport #44274)
Lets `bench migrate` finish when a custom module's app was removed. The converted sidebar is left off every dock.
Make password reset keys single use
Locks the user row and clears the reset key on first use, so two parallel password updates with the same key cannot both succeed.
Notes refresh – view, linked record, copy link, mentions and pinning
Adds a read-only note view, shows the linked lead or deal on note cards, adds Copy link, and mentions and pinning for notes.
Let each user set the default email subject for leads and deals
Each user can set a default email subject for leads and deals in Email Settings, using fields such as organization. It can still be changed before sending.
Create a deal from a contact or organization page
Adds a New Deal button to the Contact page and the Organization page's Deals tab, with the contact and organization pre-filled.
Use the tasks icon on the empty Tasks list
The empty Tasks list shows the tasks icon from the sidebar instead of an envelope.
Send each step a site takes to Pulse
Sends each setup step a site takes, such as publishing a course or enrolling a learner, to Pulse, with a flag for the site's first step. Names and titles are never sent.
Refuse a first name of only spaces
The Edit Profile form rejects a first name made of only spaces before it sends the save.
Quiz rejects repeated questions
A quiz submission holds exactly one result row per question, so a total can no longer exceed score_out_of.
Retry invites while the calendar does not push
Inviting fails while Google push is off, so the class stays in Retrying and the learners are invited once push is back on.
Enrol program learners through the program's member table
Self-enrollment writes program member rows under a row lock, and a patch repairs rows saved under the wrong parentfield.
Persist reordered courses
Keeps the course order from the drag and drop and saves the new order with the next Program save.
Limit onboarding lookups to managers and whitelist the batch one
Restricts the first-course and first-batch lookups to System Managers and Moderators, and whitelists the batch lookup so its step stops returning 403.
Keep learners' emails private on invites, and retry invites Google fails
Invites go out on a private Google event with the guest list hidden. Learners whose invite failed are retried.
Limit enrolments and lesson notes to the people they belong to
Enrolments are visible only to the learner, the course authors and the batch instructors. Lesson notes are visible only to the learner who wrote them.
Keep closed jobs and unpublished drafts out of guest reads
Closed jobs and unpublished courses and batches stay hidden from guests in lists, details and meta tags.
Escape the invite code on the sign-up page
Escapes the invite_code query parameter on the sign-up page, which blocks markup injection from a crafted link.
Export only course files the exporter may read
Course export includes only assets the exporter can read. This closes a path traversal through lesson upload URLs and a leak of other users' private files.
Send no caller another user's email
LMS endpoints no longer return another user's login email in name, owner, evaluator, member or sender fields, staff included. Callers still get their own.
Limit restricted-batch self-enrollment to that batch's staff
Only that batch's tagged instructors and evaluators, Moderators and site admins can self-enroll in a batch closed to self-enrollment.
Keep child rows and unsaved state on program save
Saving a program keeps course rows past the 20th and keeps the unsaved badge when a save fails.
Scope evaluation edits and show saved assignment work to graders (backport #2954)
v16 hotfix backport of the evaluation scope fix.
Scope evaluation edits and show saved assignment work to graders (backport #2954)
v15 backport of the evaluation scope fix.
Cap Frappe version range to supported versions
Limits the version-3 branch to Frappe 15 and 16, so it is not offered to Frappe 17.
Cap Frappe version range to supported versions
Limits the develop branch to Frappe 17 dev, so it no longer installs on Frappe 15 or 16 benches where the asset build fails.
Pass the marketplace semgrep check
Clears 9 blocking semgrep findings for the develop release, using the same changes as the version-3 fix.
Pass the marketplace semgrep check
Clears 34 blocking semgrep findings for the version-3 release. Endpoints that committed writes by hand now take POST, and an import job scrubs table names during validation.
Turn the asset store back on for public groups
Same asset store change on the press line.
Record when each build step ended
Adds an End Time field to Deploy Candidate Build Step, set the first time the step's DONE line is seen.
Improve team switching and usability
Team switching keeps the current section, adds a searchable team dropdown, moves Theme into the profile menu, and simplifies invitations.
Add v16 Desk sidebar and dock for Education
Adds a v16 Desk sidebar and dock for Education.
Add an enabled option to useMessages
Adds an enabled option to useMessages, default true, that stops fetching messages and joining realtime rooms when false.
Roll out metald builds with Metald Update
Adds a Metald Update rollout that upgrades Metal servers in batches, with a health check after each batch and state that survives format changes.
Stamp each build step's DONE line with when it ended
Appends the UTC time to each build step's DONE line, so Press can record when each step ended.
Enforce prebuilt assets for all marketplace apps
Requires prebuilt assets for every marketplace app.
Add a skill that takes a finished branch to a merge-ready PR
Adds a /ship-it skill that runs review, tests, docs, lint and PR steps in order, asking the developer only for decisions that are theirs.
Pick which UI suites run; purchase cycle browser test
Each Cypress spec declares its app, `run.js` runs only the chosen specs, and a new purchase cycle browser test is added.
Choose app and test suites for UI runs
Adds an app picker and test suite picker to the Run page, and marks suites whose app is not installed on the site.
List every recipient of a site in one paged call
Adds a site endpoint that lists every mailing list recipient in one paged call, so the index no longer uses one call per list.
Choose the Inbox's categories, and clear a list in one go
Lets each person choose which categories split their Inbox, and adds a View menu for the split.
Category tabs over the Inbox
Splits the Inbox into Primary, Updates, Forums and Promotions tabs, with unread counts on each.
Open cloud settings from the rail
Adds a Cloud Settings button to the desktop rail for Pilot-managed sites, opening Billing, Domains and Advanced.
Restore usage card backgrounds
Restores the card background on server and storage usage meters so each resource stands apart.
Harden CSI download against Sandbox's documented responses
The TDS CSI download now follows Sandbox's documented responses, so a failure shows at the download step instead of as a later filing error.
Explain Frappe commands, preserve piped input, warn when development serves one site
Explains the `pilot frappe` command syntax, keeps piped input when `pilot start` runs, and warns when development serves only one site.
Build the mailing list index in two Suite Cloud calls (backport to forge/drive-layer)
Same index fix on the forge/drive-layer line.
Build the mailing list index in two Suite Cloud calls
The mailing list index reads all lists and recipients in two calls and keeps the last good index when a refresh fails.
Size image volumes to the image
Image volumes are the image size rounded up to a whole MiB, without the extra 64 MiB, so VMs whose disk equals their image size can be snapshotted.
Default the memory snapshot disk to the rootfs size
A memory snapshot without a requested disk size uses the larger of the VM disk and the rootfs size, so the snapshot validates.
Ensure validation failures are also pruned
Prunes the build context even when a validation error occurs.
Show push settings from boot without asking older sites
Push settings come from boot data, so older sites do not need an extra request to show them.
Keep a sheet open when it opens as another closes
On Android Firefox, the poll sheet no longer closes straight after it opens from the actions sheet.
Serve version-3 to Frappe 15 and 16 benches
Serves the version-3 Insights release to Frappe 15 and 16 benches, and the develop release to Frappe 17 dev.
Give an installed iOS 26 app its full-screen viewport
In an installed iOS 26 app, the mobile shell fills the screen, and the tab bar's bottom padding clears the home indicator.
List the best search matches first
Combobox and MultiSelect rank matches inside each group, so an exact or starts-with match shows above looser matches.
Make editor menus clickable inside a Dialog and rank @mentions
@mention menus inside a Dialog can be clicked, and mention results are ranked so an exact match such as @sar shows the closest name first.
Include retaining allowance in pf wages
Counts Retaining Allowance as a PF wage component, so the employee EPF deduction and the ECR export include it, as EPF Act s.6 requires.
Validate webhook request signatures
Checks the X-Twilio-Signature header on the guest Twilio webhooks and rejects requests when the auth token is missing.
Tuesday, October 13
Run negative batch report in the background
The Negative Batch Report runs in the background, so large sites don't hit the web-request timeout.
Correct work order dashboard values and translations
Duplicated Work Orders no longer show "NaN items produced", and operation statuses are translated.
Invalid depends_on expression in stock entry report view
Opening a Stock Entry preview from Report View in a fresh tab no longer fails with an invalid depends_on expression.
Task status in embedded list
Task status shows correctly in the embedded list.
Follow-up fixes for the bug review PRs
Follow-up fixes from a second review of the bug review PRs, including supplier hold, each with a test.
Children of every selected group and refunds of earlier credit notes
Children of every selected cost center group are included.
Resolved by, closed claims, cancel with active visits and warranty status date
Five Warranty Claim bugs are fixed, including a Sales Person written into Resolved By.
Fix deposit sign and paid purchase invoices
Deposits no longer show as withdrawals.
Call summaries, transferred agent and linking customers and past calls
The agent who took a call can save its summary.
Keep amounts at different rates in separate rows
Amounts at different withholding rates are no longer merged into one row.
Return no rows for a shareholder that does not exist
A saved report for a deleted shareholder returns no rows, instead of raising an error.
Show parent company as text
Permissions on a parent company no longer hide a subsidiary's rows.
Drop the ageing chart when companies use different currencies
The ageing chart is dropped when companies use different currencies, instead of mixing them.
Count other operating and investment income in the ratios template
The Financial Ratios Analysis template includes other operating and investment income in profit.
Require API key and frequency to enable YouTube tracking
YouTube tracking can't be enabled without an API key and frequency.
Count every issue in exactly one time slot
Issues created after 11 PM are counted in a slot.
Correct assignee averages, SLA counts and Assigned To filter
Assignee averages no longer count missing values as zero.
Periods, quarters, user permissions and assigned to filter
Periods beyond 52 are no longer cut off, and the report applies user permissions.
Flag allocations to cancelled invoices and deleted vouchers
Payment ledger rows still pointing at cancelled invoices are reported.
Allocate POS change once per invoice (v15 backport)
POS change is allocated once per invoice.
Recalculate totals on disable rounded total toggle
Toggling Disable Rounded Total updates Rounded Total and Rounding Adjustment immediately.
Update requested quantities for subcontracting
Submitting a subcontracting Material Request updates the Sales Order Item's requested quantity, so later requests don't double-count it.
Subcontracting Order and Subcontracting BOM bug review fixes
Subcontracting Order and Subcontracting BOM bugs from the bug review are fixed, one commit and test each.
Subcontracting receipt bug review fixes
Eleven Subcontracting Receipt bugs are fixed, including rejected-only rows consuming raw material.
Delivery Trip bug fixes
Nine Delivery Trip bugs are fixed. A removed stop no longer leaves its Delivery Note linked to the trip.
Stock Reconciliation bug fixes
Eight Stock Reconciliation bugs are fixed, each with its own regression test.
Filter serial service contract expiry report
The Serial No service contract expiry report no longer shows consumed or delivered serials without a contract.
Correct serial ledger filters and row details
Serial Ledger includes child warehouses for a group, applies warehouse permissions to every row, and returns rows when As On Date is cleared.
Split metrics, receiving inbox, list status validation, sent-mail issues and assignments
Portal users can no longer set an issue's customer or status. Those values come from the saved issue.
Filter by finance book, skip closing entries
The report reads dimension values and GL entries with the user's permissions.
Label the company currency total column correctly
The report keeps only rows whose Customer or Supplier the user can read.
Add finance book filters to exclude other books' entries
Parties are read with the user's permissions, and the report filters by finance book.
List only payments against invoices and apply user permissions
The report lists only payments and applies user permissions.
User permissions, credit notes and company and date filters
Invoice totals are read with the user's permissions, so only invoices the user can read are counted.
Company permission and balance sheet openings at the closing rate
The report checks read permission on every selected company before running.
Respect permissions in downtime analysis
The Downtime Analysis chart no longer shows workstation names and totals the user cannot access.
Add system fields to card and preview pickers
Created By, Created On, Last Updated By and Last Updated On can be shown on Kanban cards and previews.
Style picker for the standard print format
The Standard print format gets a style picker and a font choice, and paper size and orientation can be set. Email attaches the PDF with the same settings.
A sidebar v16 generated from an app workspace is the app's
Sidebars that v16 generated for app workspaces are now the app's own, so frappe.io no longer gets duplicate custom modules.
Allow retrying failed app installations
A failed app install no longer blocks retries. The install is committed only after its hooks and patches run.
Show include filters when a report print format is selected
The Include filters checkbox shows when a report print format is selected.
Open shell URLs for users who cannot see the shell
A desk link naming a module the user cannot see opens the document in a visible shell, instead of showing "No permission for Page."
Awesombar should pick the correct shell
Opening a doctype from the awesomebar switches to the sidebar it belongs to, instead of staying on the current one.
Permission checks in workspace update_page and onboarding step update
Public workspaces can no longer be unpublished by users without roles, and the onboarding step update ignores fields other than skip and complete. Both now have tests.
Show Holiday List Assignment in Holiday List connections
The Holiday List connections tab shows which employees and companies use the list.
Polish save tooltip, preview badge and lesson title focus ring
The save tooltip is plain text, the preview badge uses theme colors, and the lesson title has a focus ring.
Assessment placement scope and settings review findings
Placing another author's assessment in your lesson no longer makes it editable. Write, delete and share stay with its authors.
Install extensions from Builder Hub and manage them in the editor
Extensions install from Builder Hub in a queued job, and an Extensions panel is added to the editor.
Let an extension create and change its own doctypes
Extensions can create, read, update and delete their own custom doctypes, with a permission check and a confirmation dialog.
Let extensions edit the page and add more surfaces
Extensions get methods to edit documents, blocks, state and windows, plus a context menu, property sections, a left panel tab and a settings page.
Restore beta releases with npm trusted publishing
The beta publish workflow uses GitHub Actions OIDC instead of the expired npm token.
Upload download delete S3 actions
S3 upload, download and delete actions are added.
Show the free trial end in the billing panel
The billing panel shows when a free trial ends, and the data deletion date for stopped trial sites.
Frappe-ui style axis, bars, legend and tooltip
Axis charts get rounded bars, a nicer Y-axis step, a dotted grid, a new legend, and a tooltip beside the hovered column.
Find the bench for an app linked into apps/
An app symlinked into a bench's apps folder builds and runs in Vite dev.
Schedule posts
Discussion drafts can be scheduled to publish later, and stay editable until then.
Setup Raven Cloud via Frappe Cloud
Raven turns on push notifications through Frappe Cloud, with no sign-up or key pasting.
Show what matched in recipient suggestions
Recipient suggestions show the matched text in bold and read the address at the row's own size.
Select threads in All accounts
Threads can be selected across all accounts, with bulk actions that run per account.
IronCalc as the only engine; remove the old engine
IronCalc is the only spreadsheet engine in Sheets, and the old JS engine files are removed.
Add hostels, room booking, and buildings and floors for rooms
Adds hostel management with term-based billing, room booking, and a Building and Floor structure. Room becomes the single room master, and a patch merges Class Room into it.
Reach the bottom edge in an iOS 26 installed PWA
The mobile shell fills the screen to the bottom edge in an installed iOS 26 PWA, and the tab bar clears the home indicator.
Install app JS dependencies with the package manager the lockfile names
Pilot installs app JS packages with Yarn or pnpm, based on the lockfile, with a frozen install.
Ignore aborted requests when loading resize options
An aborted catalog request no longer shows "Couldn't load resize options" over valid data.
Refetch the open channel after background when its window is deep or was jumped to
An open channel reloads after the app returns from background, even if its window was deep or jumped to.
Hide spaces the user cannot open from the space switcher
The space switcher lists only published spaces the user can read.
Await draft commit before closing edit mode
Saving a comment edit waits for the draft commit before closing edit mode, so the draft row is not left behind.
Set allmulticast on the mesh uplink in host setup
Hosts with Broadcom bnxt_en NICs use allmulticast instead of promiscuous mode, because firmware 214 blocks receive traffic in all-multicast mode. Mumbai hosts now run firmware 230, which fixes the stall.
Close the gaps in the product trial lifecycle
The trial starts when Central records the site, readiness is recorded by a background probe, and failing steps are retried. This stops free servers from running with no end date and paying customers' servers from being stopped after a failed conversion.
Monday, October 12
Require company
The Company filter is now mandatory, so the report always runs for one company.
Use the quality inspection's own template for job card criteria
Job Card inspections judge readings against the quality inspection's own template, not the Item's.
Inventory Dimension bug fixes
Fixes 5 bugs, including a mandatory dimension being created as optional because the document field's dict was mutated.
Delivery Note bug fixes
Fixes 8 Delivery Note bugs from the bug review, each with a regression test.
Repost Item Valuation bug fixes
Fixes 6 bugs, including a backdated entry submitted during a running repost losing its own repost.
Serial and Batch Bundle bug fixes
Fixes 4 bugs, including a standalone bundle changing batch valuation without a Stock Ledger Entry.
Bar_list hover tooltip and layout polish
Adds a hover tooltip with name and tooltip_format options, lets the chart fill its host's height, and thickens the bars.
Composer allowedFileTypes and attachments slot, align trailing labels
Adds an allowedFileTypes prop to the composer that filters picked files, and an attachments slot so hosts can render their own attachment chips.
Centre activity timeline loading and empty states, stop load-more flash
Centres the loading and empty states in the activity timeline and stops the "Show previous activity" control flashing over cached rows.
Settings dialog layout on mobile
On small screens the settings tabs become a scrollable row above full-width content.
Default margins for classic formats converted at print time
Classic formats with all margins at 0 now print with the default margins instead of flush against the paper edge.
Use the print format's @page margin in chrome pdfs
Chrome PDFs use the @page margin from the print format's CSS. Values that cannot be converted fall back to 15mm.
Convert inch lengths in convert_uom
Restores PDF downloads for print formats with inch @page margins, which had broken since #44255.
Show the help center when onboarding completes after the help modal mounts
The help modal could stay on "Getting started" and show an empty panel if onboarding completed after it mounted. It now switches to the Help center.
Build web-process URL from server config
The realtime server builds the web-process URL from webserver_host, or 127.0.0.1:webserver_port, instead of the incoming connection. Tenant routing still uses the site-name header.
Use shared request session
Webhook requests use the shared session, and scheduled retries are preserved.
Opening a ticket doesn't clear its notification count
Tickets are marked seen on every switch and on mobile, and the sidebar count refreshes. Needs frappe/frappe#43658.
Sync docs-site repos without Markdown changes
Git-synced spaces can take docs-site repos as they are: root-relative links resolve, sidebar URLs keep their intended slugs, and the sidebar and page titles are handled without edits.
Allow skipping migrate in New Site from Backup
The restore endpoint accepts an optional skip_migrate flag, so migrate can be run later.
Finish product trials
Signup sites are free for a set number of days, then stop and are later deleted. Adding a payment method converts them to paid sites and grants the welcome credit.
Attach and detach public addresses with IPv4 billing
Teams can attach or detach public IPv4 (billed monthly) and IPv6 (free) addresses from the Networking tab.
Edit ssh keys and termination protection on a server
Adds SSH key editing through the Atlas tenant API and a lock button to turn termination protection on or off.
Edit the firewall of a server
Adds a server:network capability and a Networking tab to view, edit and copy a server's firewall. Changes are sent to Atlas.
Simplify firewall edits and correct resize selection
Resize cards, the summary and the submitted target agree on storage, and firewall entries are edited inline with explicit pending changes.
Expose an accessible name on the progressbar
The progressbar gets an aria-label from the label prop, or the name "Progress" when no label is given.
Discard stale suggestion popup positions
Late popup position results from overlapping runs are discarded, and a ResizeObserver repositions the popup when its height changes.
Paint no fill behind an image
Subtle rail items with an image have no background fill. Items without an image keep theirs.
Stop echarts cutting an already shortened category label
Shortened axis labels such as "Referral…Network" display as shortened, without ECharts cutting them a second time.
Keep native drag payload in read-only editors
Links in read-only editors can be dragged into other fields again.
Use logical start/end instead of left/right for prefix/suffix slots
Prefix and suffix slots follow the page's text direction, so they work under dir="rtl".
Stop media plugin sizing images and videos on document open
Width and height are added to media only after the person's own edit. Opening a document no longer changes it.
Correct the checked hover state
Checked and indeterminate checkboxes lighten on hover and press, and the non-padded control stays flat.
Re-emit doctype_subscribe on socket (re)connect
Realtime list and document resources keep receiving updates after a reconnect. Subscriptions are tracked per socket.
Leave the uplink receive mode to host setup
WG Mesh no longer sets allmulticast on the private uplink, which stalls bnxt_en NICs; host setup now chooses the receive mode.
Sunday, October 11
Prepare pdf tests and formats for chrome-only rendering
Bank statement tests and the Proforma Invoice format use `get_pdf` with Chrome, and CI installs Chromium, so ERPNext works once wkhtmltopdf is removed.
Validate opening stock serial and batch settings
Opening stock for serialized or batched items is now validated against the naming settings, so it no longer gets silently skipped. Also stops a background job from being queued when it would create no stock.
Allow stock users to submit linked purchase receipts
Stock Users can submit a Purchase Receipt linked to a Production Plan through a subcontracting Purchase Order, because the receipt no longer needs write access to the plan.
Match the file country code to the stored lowercase code
Import Supplier Invoice now matches uppercase Italian country codes on PostgreSQL, so it no longer fails on every file.
Delivery Settings bug fixes
Delay between Delivery Stops can no longer be negative, which made ETAs go backwards. Fixes two bugs in total.
Shipment Parcel Template bug fixes
Stock Manager can now use Add Template on a Shipment. Fixes two bugs in total.
Item Variant Settings bug fixes
Allow Different UOM is no longer undone by saving a template. Fixes two bugs in total.
Item Alternative bug fixes
Substitutes used in Work Order transfers are now checked against Item Alternative and the Work Order setting, and the transfer is no longer credited to the original item. Fixes two bugs in total.
Quality Inspection Template bug fixes
A formula-based row must have a formula before the template saves. Fixes two bugs in total.
Packing Slip bug fixes
Packing slip rows must belong to the slip's own Delivery Note, so another DN's row can no longer be packed. Fixes three bugs in total.
Quality Inspection bug fixes
A row's Quality Inspection is now checked against its document and item on Delivery Note, Sales Invoice and other documents, not only Purchase Receipt. Fixes six bugs in total.
Quick Stock Balance bug fixes
Past-date qty and value now use the same cut-off, so later entries that day are counted in both. Fixes two Quick Stock Balance bugs in total.
Stock Entry Type bug fixes
Add to Transit ticked on the standard Material Transfer type no longer traps goods in transit. Fixes two Stock Entry Type bugs in total.
Item Standard Cost bug fixes
Entries before a same-day revaluation and cancelled entries are no longer skipped by the backdating rule. Fixes six Item Standard Cost bugs in total.
Item Manufacturer bug fixes
Duplicate manufacturer part numbers are now caught on edit, and the Item default is no longer cleared by a non-default row. Fixes three Item Manufacturer bugs in total.
Shipment bug fixes
Shipments from a Delivery Note are valued at the DN total including taxes, not the net item amounts. Fixes seven Shipment bugs in total.
Item Attribute bug fixes
Changing an abbreviation no longer renames variants that have a user-chosen item code. Fixes three Item Attribute bugs in total.
Warehouse bug fixes
A plain save can no longer flip a warehouse between group and ledger, and the ledger check now runs on update. Fixes eight Warehouse bugs in total.
Item Lead Time bug fixes
The scheduler no longer applies Daily Yield twice, so planned quantities are correct. Fixes five Item Lead Time bugs in total.
Serial No bug fixes
Fixes three Serial No bugs, including cancelling a Stock Reconciliation wrongly marking its serials as delivered.
Batch bug fixes
Expiry from shelf life counts from the receipt date, not today, for batches created by backdated receipts. Fixes five Batch bugs in total.
Price List bug fixes
Changing a price list's currency now converts the prices, not just the label. Fixes three Price List bugs in total.
Item Price bug fixes
Customer and batch prices now take priority over a general price with a later valid-from date. Fixes three Item Price bugs in total.
Consume alternative items in the ratio they were transferred
Duplicate of #60090 with the same change.
Consume alternative items in the ratio they were transferred
Duplicate of #60090 with the same change.
Consume alternative items in the ratio they were transferred
Splits raw material consumption between an item and its alternatives in the ratio they were transferred. Same change as #60091 and #60092.
Stock Settings bug fixes
Makes the ledger and repost logic use the Default Valuation Method correctly, so backdated entries are reposted under Standard Cost. Fixes five Stock Settings bugs in total.
Landed Cost Voucher bug fixes
Sums vendor invoice claims across vouchers instead of overwriting them, caps claims at the invoice amount, and stops cancellation from zeroing claims. Fixes four bugs in total.
Refactor!: remove wkhtmltopdf and render every pdf with chrome
Removes wkhtmltopdf and pdfkit, so every PDF renders with Chrome. This is a breaking change: print formats set to wkhtmltopdf switch to Chrome on migrate, and the PDF Generator setting is removed.
Close only the topmost dialog on escape
Esc on a message popup over a dialog closes only the popup, and the dialog keeps what was typed.
Encode meta image url in share tags
Share previews show the page image when its file name has spaces or non-ASCII characters.
Honour page breaks and Print if empty in Typst PDFs
Typst PDFs now break pages at Page Break blocks and print labels for empty "Print if empty" fields.
Preview a chrome format with its own @page margin
The print preview uses a Chrome format's own `@page` margin, so it matches the PDF.
Preview a chrome format with its own @page margin
The print preview uses a Chrome format's own `@page` margin, so it matches the PDF. Backport of #44244.
Match Chromium for zero values and empty sections in Typst PDFs
Typst PDFs now print zero values for "Print if empty" fields and skip empty labelled sections with their page breaks, as Chromium PDFs do.
Use the print format's @page margin in chrome pdfs
Chrome PDFs use the `@page` margin from a print format's Custom CSS, so they match the preview.
No message when a generated pdf cannot be shrunk
Large PDFs that cannot be shrunk now fall back silently to the original, and the "Failed to optimize PDF" message shows only on uploads.
Compact Filter and Sort with Created by, Access and Unpublished changes filters
Status and Sort selects become a Filter popover with a count chip and a Sort menu, with new filters for creator, access and unpublished changes.
Stop page client script modal from shifting on scroll
Caps the Page Client Script editor height so the modal always fits the window and no longer jumps when scrolled.
App Favicon, combined Settings Dialog
Studio apps get a favicon setting and can be renamed from the frontend. App and Studio settings merge into one Settings dialog.
Build Ubuntu images from the latest release and kernel
The image builder uses the latest Ubuntu cloud image and supported kernel for each release, and adds minimal images for all versions.
Join and leave workspaces from the mobile workspaces drawer
Users can join and leave workspaces from the mobile workspaces drawer.
Add chart skeletons and plan limits to usage charts
Usage charts show loading placeholders, and the CPU and memory y-axes stop at the plan limit.
Enhance server transition animations and improve layout
Smoother transitions between servers, with the list on the right and the map in the centre.
Add smooth slidein animation for server detail page
The server detail page slides in smoothly.
Servers map revamped
The servers page now has an always-open list, an inset map card, a regions toggle, richer spot cards, and a map refactor. Also fixes truncated labels.
Server page actions, clearer resize and fractional vCPU
The server page gets the server list's Actions menu, with Rename added. The resize dialog explains its choices and loads the current size on every open, and fractional vCPU sizes are supported.
Use the chrome header template when no pdf generator is set
Letter head headers and footers stop disappearing from reports, auto email reports and email attachments when no PDF generator is set.
Bug reports from the #gameplan channel
Fixes eight reported bugs, including wrong discussion after navigating, rail badges drifting off their icons, slow reactions, and a broken digest email.
Settle a restart when the server reads running
A restart now succeeds once the server reads as Running, instead of sitting at "Restarting" for ten minutes and then failing.
Install modules for the pinned kernel in every image
Every image gets modules for the kernel it boots, so Docker and BPF tools work on Ubuntu 22.04 and 26.04 VMs.
Report guest memory use from the balloon device
New VMs boot with a balloon device that reports guest memory and returns freed pages to the host, so the memory chart matches the guest.
Multiple UI fixes
Keeps mention read state when a message is edited, stops soft 404 pages from previewing, makes polls inert on the threads page, and fixes mobile Later and print dialog layouts. Also fixes CI tests and adds keyboard workspace switching.
Show custom emoji in last message in DMs
Shows custom emoji in the last-message preview in DMs.
Look up a channel missing from the list before showing a DM as not found
Looks up a channel that is missing from the list before reporting a DM as not found.
Delete admin members using controller when user is deleted
Admin members are removed through the controller when a user is deleted.
Keep NDP lookups intact under checksum offload
Guest checksum offload could write into the NDP target address, so VM-to-VM lookups across hosts failed. The solicitation now carries a valid target and checksum.
Select unicast NDP before VMs start
metald picks unicast NDP mode before any VM sends NDP, so hosts on networks without IPv6 multicast stop losing their uplink on each metald start.
Saturday, October 10
Drop the full cache clear on save
Employee saves no longer clear the entire site cache, since the nested-set fix now refreshes user permissions.
Default quality inspection sample size to one
Same change as #60292, the original PR.
Let sales users read and sales master managers maintain segments
fix(market-segment): let sales users read and sales master managers maintain segments
Give sales users read access to sales stages
fix(sales-stage): give sales users read access to sales stages
Purchase Order bug review fixes
Thirteen Purchase Order bugs are fixed, including drop-ship cancellation leaving the Sales Order delivered.
Add company filter and apply permissions
fix(first-response-time-for-opportunity): add company filter and apply permissions
Validate company and vat accounts, follow company renames, limit settings roles
fix(uae-vat-settings): validate company and vat accounts, follow company renames, limit settings roles
Vat charged as an actual amount and user permissions
fix(vat-audit-report): vat charged as an actual amount and user permissions
Sales roles, submitted invoices, recipients format and one row per lead
fix(lead-conversion-time): sales roles, submitted invoices, recipients format and one row per lead
Opportunity rate, company for amounts and missing sales stage
Foreign-currency opportunities convert at their stored rate.
Apply minimum lead age to older leads
Minimum Lead Age keeps leads older than the cut-off, not younger.
Include child territories and show every lost reason when filtering by one
fix(lost-opportunity): include child territories and show every lost reason when filtering by one
Include child territories, list each lead once and list leads without a company
fix(lead-details): include child territories, list each lead once and list leads without a company
Render terms ending in a file extension and blank contract fields as empty
Terms ending in .html or .txt render, and blank contract fields show as empty.
Offer slots with no agents, require a positive duration and refuse overlapping slots
Appointment slots work with no agents, and overlapping or zero-length slots are refused.
Timestamp update for lead and opportunity, quotation validity on the server and carry forward
The "update timestamp on new communication" setting applies only to Lead and Opportunity.
Count partly ordered quotations and activity after conversion, apply permissions
fix(campaign-efficiency): count partly ordered quotations and activity after conversion, apply permissions
Apply campaign pricing rules, allow deleting campaigns and fix campaign efficiency counts
Campaign pricing rules apply to sales transactions, and campaigns can be deleted.
Asset permissions, disposed asset values and reversed depreciation
Grouped views only include assets the user can read, and disposed values are corrected.
Correct disposals, finance books and reversals, add adjustment column
fix(asset-depreciations-and-balances): correct disposals, finance books and reversals, add adjustment column
Take back additional costs on Subcontracting Receipt returns
Returns of Subcontracting Receipts reverse the additional cost they originally booked.
IFRS template double-counts short-term borrowings and drops uncategorised accounts
The IFRS cash flow template no longer counts short-term borrowings twice or drops uncategorised accounts.
Keep service dates after the period end in order on auto-repeated invoices
Service dates past the period end stay in order, so the invoice saves.
Keep short service ranges after the period end on auto-repeated invoices (version-15)
Same fix as #60328, for v15.
Keep short service ranges after the period end on auto-repeated invoices
Service dates on auto-repeated invoices are shifted correctly, so a short range doesn't land in the wrong month.
Link lead quotations and opportunities to its customer
Quotations and Opportunities of a Lead move to the Customer made from it, so they show on its dashboard.
Link lead quotations and opportunities to its customer (v15)
fix(selling): link lead quotations and opportunities to its customer (v15)
Link lead quotations and opportunities to its customer (v16)
fix(selling): link lead quotations and opportunities to its customer (v16)
Keep dimensions on duplicated rows
Duplicated rows keep their own dimensions instead of taking the header value.
One header to row copy for accounting dimensions (backport #59753)
A header dimension change now updates every row, through one handler.
Prevent planning a sales order line more than once
Same fix as #60272, the original PR.
Prevent planning a sales order line more than once (backport #60271)
Production Plan fetches only the unplanned qty of each Sales Order line and blocks plans that exceed it.
Default job card completion to previous operation output
Same fix as #60278, the original PR.
Default job card completion to previous operation output (backport #60275)
The Complete Job dialog defaults Completed Quantity to what the previous operation allows.
Handle multiple batches in pick list bundles
Allocating a Pick List item with several batches in another open Pick List no longer raises a KeyError.
Validate item conversions and work order links
Alternate UOMs need a positive conversion factor, and a component of a submitted Work Order can't have Maintain Stock turned off.
Respect unreserved work order components
Same fix as #60289, the original PR.
Fix(manufacturing): respect unreserved work order components (backport #60161)
A Work Order shows Stock Reserved only when every component is reserved.
Keep prospects on lead delete, one prospect per lead and convert to customer once
Deleting a lead no longer deletes its Prospect with its notes, opportunity rows and linked contacts.
Correct disposal GL and sold status, validate asset sale, split and opening depreciation
Disposal credits the full asset cost, so the fixed asset and accumulated depreciation accounts no longer drift.
Depreciation schedule double posting, manual schedule validation and booked months
Depreciation rows already booked are no longer posted again when the daily job runs by index range after a cancelled entry.
Validate cost center changes and preserve numeric names
Same change as #60276, the original PR. Also stops renames of names that start with digits from corrupting the display name.
Validate cost center changes and preserve numeric names (backport #60237)
Cost Center saves can no longer change company, use cross-company parents or convert groups in ways that skip the GL and allocation checks.
Delete Company: remove password verification
Drops the client-side password prompt; the existing type-the-company-name confirmation stays.
Apply user permissions in stock reconciliation balance lookups
fix(stock): apply user permissions in stock reconciliation balance lookups
Check putaway rule permission in get_available_putaway_capacity
fix(stock): check putaway rule permission in get_available_putaway_capacity
Apply user permissions in get_stock_balance (backport #60245, #60260)
fix(stock): apply user permissions in get_stock_balance (backport #60245, #60260)
Apply user permissions in get_stock_balance (backport #60245, #60260)
fix(stock): apply user permissions in get_stock_balance (backport #60245, #60260)
Apply user permissions in get_stock_balance
fix(stock): apply user permissions in get_stock_balance
Soft module icons
Framework dock icons become single-colour soft icons that follow the tile's ink.
Group by multiple fields and aggregate multiple columns
Report View supports several group by fields and several aggregates (Count, Sum, Average, Min, Max).
List all fields on focus and keep keyboard focus in filter and group by popovers
The field picker lists all fields on focus, and keyboard focus stays inside the filter and group by popovers.
Trim tables on sqlite and clear stale column cache
Trim-tables drops orphaned columns one at a time on SQLite and clears the column cache.
List and drop ghost tables on Postgres in trim-database
`bench trim-database` no longer crashes on Postgres.
Link preview popover rebuilds on control value change
fix: link preview popover rebuilds on control value change
Show Field as read-only in form builder
The Field dropdown in the Web Form builder shows the value instead of an empty select.
Validate series options and default together
Naming series options and default are validated together.
Show password field even if it's an fc site
The setup wizard shows the password field on Frappe Cloud sites too, since no reset email is sent during setup.
Filter amended documents in audit trail
The Audit Trail Document field lists only amended transactions (v15 backport).
Revert "fix: clear include filters and hide column picker when a print format is set (backport #42528)"
Reverts #42546 for the same reason.
Revert include filters and column picker change
Reverts #42528, which hid the Include filters checkbox and column picker when a print format is set.
Global search shows permission errors for hits the user cannot read
Same fix as #44214, the original PR.
Report links do nothing when split view is off or on ctrl-click
Same fix as #44205, the original PR.
Form goes blank after a table multiselect row is changed
Same fix as #44211, the original PR.
Accept form-encoded new_page and save_page args
Creating a private workspace and saving a workspace on v16 work again; both requests were failing with a type error.
Disabled about and contact pages still appear in sitemap.xml
fix: disabled about and contact pages still appear in sitemap.xml
Count fieldname bytes against the Postgres identifier limit
Long non-ASCII custom field names no longer get truncated on Postgres, which caused duplicate-column failures on every later schema sync.
Normalize Unicode passwords before hashing
Passwords are hashed in NFC form, so the same password typed on different keyboards or OSes is accepted.
Refresh user permissions when the tree changes
Adding or moving a tree node now clears cached user permissions for other users, so permission changes apply without a full cache clear.
Override comment_email & comment_by
Comment author fields are derived on the backend instead of trusting client values.
Check create, not write, to run a method on an unsaved doc
Running a whitelisted method on an unsaved document now requires create permission rather than write.
Validate string and Literal annotations
Whitelisted methods using string or `from __future__ import annotations` annotations are now type-validated, so crafted dict arguments are rejected.
Replace `verify_password` util with Confirm Sensitive Action dialog
Replaces the client-only password prompt with a confirm dialog, since the old prompt guarded nothing on the server.
Show priority bars on tasks and in the priority dropdown
Priority shows as signal bars on tasks and in the dropdown; the dot never rendered before.
Keep brand favicon on dashboard, data import and onboarding pages
Same fix as #3006, the original PR.
Use frappe-ui/charts on the dashboard
The dashboard uses the new frappe-ui charts, and number cards show change against the previous period.
Move agents off an agent status when it is disabled (backport #3433)
Agents are moved off an agent status when it is disabled.
Correct SLA deadline timezone and hold-time deduction (backport #3776)
Corrects SLA deadlines for timezone and deducts hold time properly.
Add build, New Bench and prune charts
Build Server Stats shows its charts in a grid, with eight new charts for builds, New Bench and prune activity.
Allow users to purchase credits based on outstading amount
Users with a small outstanding balance (e.g. ₹66.25) can pay through Razorpay; the minimum and default amounts now agree.
Send Raven alerts to the real channel ID
Same fix as #7720, the original PR.
Fill each field of GitHub's new advisory form
feat(draft-security-advisory): fill each field of GitHub's new advisory form
Collections & Delinquency Management (#1489)
Manual backport of #1489 to version-16-hotfix.
Collections & Delinquency Management module
Adds a collections module that opens cases for delinquent loans, assigns officers, tracks payment promises and sends reminders.
Send site mail under the site name from the bench mailbox
New sites send mail under their site name through the bench mailbox.
Give each new server a mailbox from its region's mail service
Each new server gets a send-only mailbox from its region's FrappeMail Service.
List a server's hostnames in team identity tokens
Team identity tokens list the hostnames of the team's sites on the server.
Take the SMTP endpoint from the Suite site
FrappeMail Services take their SMTP server and port from the Suite site, with a Refresh SMTP Info button.
Resume the selected product
Returning customers resume onboarding for the product they picked and reopen their existing site.
Refill the mailbox pool only to its minimum
A mailbox refill creates only the mailboxes the pool is missing, not a fixed 50.
Keep text color on bold text in every prose variant
Bold text keeps its named color in every prose variant, not only prose-v3.
Report the requested disk size as the desired size
Resizing a VM without changing its disk size no longer fails with "Disk size can only increase".
Point chromium_path at the real Chromium binary
Chrome PDF renders no longer leave Chromium processes running, since the path now points at the real binary instead of a wrapper.
Friday, October 9
Allow submit with confirmed stock value difference within 1%
A Period Closing Voucher can be submitted when the stock asset difference is within 1%, after the user confirms the amounts.
Add United States chart of accounts template
Adds a US GAAP chart of accounts template used for companies with Country set to United States.
Hide Overview tab on unsaved customers
The Overview tab is hidden on new Customers until they are saved.
Pool group sub assembly warehouse stock in production plan (backport #60210)
Backport of #60210.
Pool group sub assembly warehouse stock in production plan
Sub-assembly stock across child warehouses of a group is summed into one pool for netting, so Production Plan no longer under-produces.
Exclude the current company's retention warehouse from source pickers (backport #60189)
Backport of #60189.
Exclude the current company's retention warehouse from source pickers
Source warehouse pickers on Stock Entry refresh the Sample Retention Warehouse when the company changes.
Look up party addresses by DocType name
On PostgreSQL, selecting a Customer or Supplier on a Tax Rule now fills the billing and shipping addresses.
Conversion rate, periods across years, filters and permissions
Foreign-currency opportunities convert at the rate stored on the opportunity, periods work across years, and filters and permissions are fixed.
Validate vat accounts, refuse company change, limit settings roles
VAT accounts are validated (company, group, duplicates, empty rows), so the VAT Audit Report picks the right rows. Company changes are refused and settings roles are limited.
Import line quantities, credit notes, surcharges and suppliers as in the file
Payment codes are read from the correct field, and line quantities, credit notes, surcharges and suppliers import as they appear in the file.
Lapsed fulfilment, status, signature and checklist after submit, linked document party
The daily job sets Fulfilment to Lapsed when a deadline passes, and status, signature and checklist behaviour after submit is corrected.
Supplier pan, rate and limit checks, and locking used certificates
Certificate PAN is kept in line with the supplier, rate and limit checks are added, and used certificates are locked.
Net payments in company currency and company permission
Total Payments excludes cancelled payments and debit notes, nets off refunds, works in company currency, and respects company permission.
Reverse charge debit notes, returns, missing emirate and box 9 amounts
Reverse charge debit notes are subtracted in boxes 3 and 10, and returns, missing emirates and box 9 amounts are corrected.
Invoice permissions, bundle, drop-ship and sales order buying amounts, and group-by totals
Applies the user's Sales Invoice permissions to the report, corrects buying amounts for bundles, drop-ship and sales orders, and fixes group-by totals.
Ledger view signs, party permission, outstanding conversion, internal transfers and tree filters
Ledger view uses one sign convention, applies party permissions, fixes outstanding conversion and internal transfers, and corrects tree filters.
Round ledger-view invoice debits, convert outstanding only for foreign receivables, expand customer groups
Ledger view debits use the rounded grand total so the running balance matches the GL, and foreign-currency outstanding is converted only for foreign receivables.
Stock Closing Entry bug fixes
Stock Balance filters apply to the closing opening, and six further closing-entry bugs are fixed, each with a regression test.
Correct fiscal year selection and creation
Fiscal year selection prefers the company-specific year over an overlapping global one, Feb 28 year-end rollover is fixed for leap years, and automatic creation can recover from a missed run.
Keep payment terms, PO no and service dates on auto-repeated invoices
Auto Repeat invoices keep the payment terms template, PO No and shifted item service dates from the reference invoice.
Mark fully depreciated assets without schedules (backport #52309)
Submitted assets marked Is Fully Depreciated with Calculate Depreciation unchecked now move to the correct status in v16 instead of staying Submitted.
Derive actual dates from submitted entries
Work Orders without operations take actual start and end dates from submitted Stock Entries only, and cancellation clears stale dates.
Combine material request receipt quantities
A Purchase Receipt and a Purchase Invoice with Update Stock no longer overwrite each other's received quantity on a Material Request, so a fully received request now shows as fully received.
Keep job card qty in material request transfer (backport #60246)
Backport of #60246.
Keep job card qty in material request transfer
Job Cards could not be submitted after a Material Request transfer because the Work Order branch of the Stock Entry mapper zeroed the finished-goods qty. It now zeroes only for Work Order requests without a Job Card.
Disable update stock for sales invoice created from DN (backport #60230)
Backport of #60230.
Disable update stock for sales invoice created from DN
Sales Invoices created from a Delivery Note now force Update Stock off.
Keep each batch's rate through a material transfer
Each inward batch keeps its outward rate plus the row's additional cost, and a repost repairs entries already saved with flat batch rates.
Restyle the color picker on Espresso tokens
The colour picker drops the uppercase headings, uses Espresso's palette with a selected ring, and works in dark mode.
Explain why a section is greyed out on hover
Hovering a greyed-out section shows whether it is hidden by its visibility condition or has no values for the preview record.
Show number stepper as a single input with inline buttons
Same change as #44148, against the main branch.
Show number stepper as a single input with inline buttons
Number fields in the print editor are one full-width input with inline −/+ buttons, and arrow keys step the value.
Read use_ssl from site config for outgoing mail
Setting use_ssl in site config enables SSL for outgoing mail, so port 465 works.
Widen empty state description
Empty state descriptions are widened from 320px to 384px so most fit on one line.
Give the info card an opaque background
The field info card uses a defined background token, so page text no longer shows through it on v16.
Round the section selection ring to its radius (backport #44153)
Backport of #44153.
Round the section selection ring to its radius
The selection ring around a print section follows the section's corner radius.
Stop cutting off the bottom of badge text
Descenders in badge text (g, y, p) are no longer clipped.
Compare is set filters with the column's empty value (backport #43537)
Is Set filters compare against each column's empty value on v16.
Show Image field in report side panel preview
The Image field in Report View's side panel shows the image instead of the missing-image placeholder.
Icon picker stays open when clicking elsewhere in a child table
The icon picker closes when clicking elsewhere in a child table.
Unread count stays stale when the feed is reloaded
Reloading the notification feed also refreshes the unread count badge.
Show participant events in the calendar
The calendar now includes events where the user is a participant, such as Maintenance Schedule visits assigned to a Sales Person.
Let select-only users search linked addresses
Address link fields using address_query with link_doctype and link_name filters no longer raise PermissionError for select-only users.
Show correct status in User list for select-only users
Select-only users no longer see every user as Disabled in the User list.
Keep the file's modified on a DocType data import
Data imports keep the file's modified timestamp, so repeated migrates no longer change fixture DocTypes. Model sync still sets modified to now.
Redis_cache returns None when a parallel worker caches the result
If another worker saves the cached result between the read and the exists check, the key is read again instead of returning None.
Round robin repeats a user on concurrent saves
The last assigned user is read with a row lock, so two documents created close together no longer go to the same user.
Track index progress for every doctype
A fresh search index build seeds a progress row for every configured doctype, not only the last one.
Use a limit SQLite accepts for offset without limit
get_list with an offset but no limit works on SQLite.
Limit DocType names to the Postgres identifier length
DocType names are capped at 60 characters on Postgres, so long names no longer create truncated tables that break re-saving.
Unbound import in apply_workflow on cancel
Workflow cancellation with Queue in Background enabled no longer fails with UnboundLocalError.
Fix(bank statement) / fix(data_import): skip payload_count write when the import doctype lacks the column
Bank Statement Import fails on every run since #39887 with an unknown-column error on payload_count. The write is skipped when the doctype lacks the column.
Calculate invoice period from the reference document
Auto Repeat periods now cover Daily, Weekly and Fortnightly frequencies, the first generated document, and month-end dates that no longer drift.
Validate requests and normalize domains
Validates allowed paths, monitoring windows and configuration payloads, requires POST for actions, and keeps domain rows consistent without duplicates.
Keep a cleared filter cleared after a reload
A filter the reader cleared stays cleared after Refresh or an owner save, instead of the default filling it back in.
Open the folder of the open query or chart
Opening a query or chart in a collapsed folder expands that folder.
Resume an incremental import from the store's newest cursor
Incremental imports now take the bookmark from the newest cursor actually written to the store, so a failed bookmark save no longer makes the next run reprocess or skip rows.
Better feedback on security tab
Improves the feedback shown on the server security tab.
Fix(site-backup): Repair a crashed global search table on the site's bench
Manual backport of #7667 to master.
Repair a crashed global search table on the site's bench
Backups failing on a crashed MyISAM `__global_search` table now trigger a repair job that runs on the site's bench. The old job call had no bench or site and never ran.
Check press roles in protected endpoints
Checks press roles in the protected decorator and write-access check, so a member whose role lacks a release group can no longer deploy through bench.deploy_and_update or other protected endpoints. Teams without roles keep full access.
Feat/unicommerce charges as invoice items
Unicommerce COD, gift wrap and shipping charges are added as invoice items, so orders with charges invoice without GST mismatch errors.
Report page actions menu use from the reader
Reports Download, Copy page, ChatGPT and Claude use from the reader as one telemetry event.
Screen new senders in the Inbox, and make Block send mail to Junk
New senders appear in the Inbox with an icon and a No/Yes prompt, and blocking a sender moves its mail to Junk.
SSH keys in settings and on each server
Adds SSH key management in settings and on each server.
Product signups for Frappe Cloud apps
Each Frappe Cloud app can offer a signup from its own page, with setup handled by the app.
Add Raven and Builder signups
Adds Raven and Builder to the apps prepared for product signup images.
The overview asks Grove on every open, uncached
The AI overview fetches month usage fresh on every open, so it matches the usage page.
Page the team lists at 10 rows without the size picker
Team lists page at 10 rows with no page-size picker.
Close sheets on back instead of leaving the page
The back action closes an open sheet rather than leaving the page.
Compile published app templates in production mode
Published apps compile templates in production mode, so HTML comments no longer make a fragment root that drops block styles.
Make room for data labels only when one would clip
Charts reserve space for data labels only when one would clip, instead of always leaving an empty band.
Inset a line's ends from the value axis
Line charts get the same inset from the value axis that bar charts already had, so data labels no longer collide with ticks.
Moves AST parsing into subprocess scripts run by bench Python
App validation parses code with the bench's own Python, so apps using newer syntax no longer fail on the host interpreter.
Stale workspace responses and picture captions
Responses for a space or change request that changed mid-flight are dropped, and captioned pictures render their caption correctly.
Add the site name to streamed backup file names (backport #613)
Backport of #613.
Thursday, October 8
One header to row copy for accounting dimensions
Accounting dimension copying from header to rows is now consistent across all doctypes.
Require a company
Electronic Invoice Register now requires a company filter.
Reject manual costs above the consumed cost on save, floor them on repost
Manual finished good costs above consumed cost are now rejected instead of silently discarded.
Warehouse Type bug fixes
Built-in Transit warehouse type can no longer be deleted.
UOM Category bug fixes
Two-step UOM conversions no longer bridge unrelated categories.
Stock Ledger Entry bug fixes
Fixed fallback rate calculation for stock issued while negative.
Stock Reposting Settings bug fixes
Fixed timeslot format and reposting start messaging.
Refresh POS item stock qty on new order
POS item grid stock quantities now refresh correctly when starting a new order.
Fail loudly when the reposting data file is missing or corrupt
Reposting now fails with clear errors instead of silently using empty checkpoints.
Pick outward batches before valuing the stock entry
Batches are auto-picked before rates are set, preventing incorrect valuations.
Set employee salary currency from company
Employee salary currency now defaults from the company instead of global defaults.
Allow back-to-back working hours
Back-to-back workstation shifts no longer trigger overlap errors.
Reject invalid downtime intervals
Downtime entries now reject To Time earlier than From Time.
Slot capacity, portal time zones and holidays, agent assignment and calendar event
Fixed slot capacity, timezone handling and holiday/calendar event conflicts.
Unsubscribe handling, start-day and late steps, duplicate sends and template fields
Campaigns now include unsubscribe links, handle late steps correctly and avoid duplicate sends.
Stale status, repeat conversion, delete permission and phone sync
Lead status no longer stays stuck after opportunity/quotation is deleted.
Status from quotations, RFQ conversion factor, duplicate customers and prospect rows
Opportunity status now updates when quotations expire and RFQ mapping uses correct conversion factors.
Opening entries, cross-year profit, opening balance and accumulated totals
Cash Flow correctly handles opening entries, profit across fiscal years and accumulated totals.
Yearly profit, creditor turnover sign, company-currency averages and report roles
Report now uses yearly profit, correct signs and company currency for ratio calculations.
Report roles, child-only account conversion and cash flow working capital
Fixed account conversion rates and cash flow calculations for multi-currency consolidation.
Make the Account column a link to Account
Account column now respects user permissions.
Apply user permissions to opening balances
User permissions on accounts now apply to opening balance queries.
Periods across fiscal years and net profit without gross accounts
Date ranges crossing fiscal years and net profit calculations now include all relevant entries.
Correct grand total %, tax columns and subtotals
Report now respects filters in % calculations and shows correct tax columns and subtotals.
Start income and expense balances at the fiscal year
Account balances for income and expense accounts now respect fiscal year boundaries.
Age rows without a bill date and fix bulk payment amounts
Accounts Payable now ages invoices without bill dates and calculates bulk payment amounts correctly.
Fix cleared withdrawals and invoice currency
Fixed balance calculation for transactions cleared before posting date and multi-currency invoices.
Split same-named parties and vouchers, fix company currency for foreign accounts
General Ledger no longer merges customers and suppliers with the same name.
Make the Party column a dynamic link on Party Type
Party names in Payment Ledger are now clickable links to the customer or supplier.
Honour over delivery allowance in Delivery Note mapper
Delivery Note can now include over-delivery quantities within the configured allowance.
Apply transaction date exchange rate to purchase receipts
Purchase Receipts now use the correct posting date exchange rate instead of the order date rate.
Keep each batch's rate through a material transfer
Batch-wise valuation no longer shifts value between batches during transfers.
Split manufacture cost over all finished good rows
Manufacturing cost is now correctly divided across multiple finished good receipt rows.
Reserve sub-assembly items taken from stock
Production Plan now correctly reserves sub-assembly stock taken from the warehouse.
Do not auto-pick the same batch qty for every Stock Entry row
Auto-picked batches now correctly reduce available qty for subsequent rows.
Stock Closing Balance bug fixes
Fixed valuation rate tracking and FIFO queue handling for stock closing entries.
Use the group company column for consolidated profit totals
Consolidated Financial Statement profit rows no longer double-count subsidiary amounts.
Convert cash flow account type rows to the presentation currency
Cash Flow sections and Net Change in Cash now show correct totals when Presentation Currency is set.
Check task read permission before listing its child tasks
Child task listing now respects user permissions on parent tasks.
Validate transaction context in item detail endpoints
Added context validation to prevent unauthorized access to item pricing and batch detail endpoints.
Fix user input for lowercase boolean in set-config
fix(cli): Fix user input for lowercase boolean in set-config
Show custom label first in the builder properties panel
Web Form builder now shows Custom Label first, followed by relevant properties per field type.
Add avatar group component
New avatar group component with overlapping display, +N indicator and optional add button.
Scope a workflow to documents with conditions
Workflows can now be applied conditionally to documents based on field values, with priority support.
Data import for child tables
Child tables now support CSV import with Insert, Update and Upsert modes, field pickers, column mapping and validation.
Fix(installer)!: prefer flag over config for admin password during `new-site`
Command-line `--admin-password` flag now takes precedence over config file values.
Not found error shows two messages in the same dialog
404 errors no longer show duplicate messages.
Owner notifications skip documents created by Administrator
Notifications to document owner now resolve Administrator's email.
Name pages in the form builder
Web Form pages retain their names after builder saves.
Prompt user to update reply-to when email account address changes
Email account address changes now prompt to update Reply-To rows.
Crash on clicking Add tab in the sidebar
Form builder no longer crashes when adding tabs.
Show prepared report errors in the report view
Report failures now display error messages in the UI instead of silently failing.
Keep standard builder formats on their shipped renderer
Standard print formats remain on their original renderers during migrations.
Feat(enrichment settings UI)
Enrichment settings now have a UI with toggle, crawl budget, and social profile rules.
Readable email colors in dark mode and resizable editor
Email text and border colors are now readable in dark mode.
Use NestedSet for CRM Territory so lft/rgt and tree filters work
CRM Territory tree filters now work correctly with proper NestedSet implementation.
Count unique deals per funnel stage
Funnel chart no longer counts the same deal multiple times when it moves between stages.
Create Bob chat sessions on the first message and stop autosave writing over Bob's edits
AI sessions now create on first message instead of on page load, and autosave respects AI edits.
Keep page meta when extendRoute replaces route.meta
fix: keep page meta when extendRoute replaces route.meta
Feat!: remove Desk access from Suite User and Suite Admin
Suite User and Suite Admin roles no longer grant Desk access.
Support Generic provider and Ubuntu 26.04 in atlas-vm
Generic provider and Ubuntu 26.04 guest image support added.
Switch theme from search by typing dark or light
Typing "dark" or "light" in search now shows theme switch actions.
Add an embeddable settings UI
Cloud Settings now available as typed SDK for use in any app with optional shared dialog.
Split the canvas into typed modules, with editing fixes
Canvas refactored into ~28 typed modules with editing fixes for selections and fills.
IronCalc calculation core, previewed behind ?engine=ironcalc
IronCalc calculation engine integrated as an optional backend for Sheets.
Split delivery for relaying domains, and S3 blob store bootstrap
Mail routing now properly handles relaying domains and S3 blob store initialization.
Create accounts that send mail but do not receive it
Suite Cloud accounts can be created with receiving disabled via Stalwart permissions.
Invite accounts that send mail but do not receive it
Mail accounts can now be created send-only with receiving disabled.
Complete Generic setup without a provider catalog
Generic provider setup no longer requires provider catalog records.
Offer empty partitions as the Generic storage pool device
Host setup now accepts empty partitions and RAID arrays as storage devices.
Answer ARP for attached public IPv4 addresses
VM public IPv4 addresses now respond to ARP requests.
Answer NDP for attached public IPv6 addresses
VM public IPv6 addresses now respond to neighbor discovery.
Claim public addresses on the public interface
Metal now claims public addresses on the correct interface.
Give Suite Cloud 30 seconds to accept a connection
Suite Cloud connection timeout increased from 5 to 30 seconds.
Make the zone file export importable into Route 53
Zone file exports now split long TXT values and properly format target records.
Wednesday, October 7
Report to find and fix uncancelled SLEs of cancelled vouchers
New Stock report finds Stock Ledger Entries with is_cancelled=0 whose voucher is cancelled, so admins can repair entries affected by repost race condition.
Stock Valuation Comparison report
Report of actual vs expected stock valuation for auditing ledger accuracy (v16-hotfix backport).
Stock Valuation Comparison report of actual vs expected valuation
New script report shows every Stock Ledger Entry's actual vs expected balance qty, value and rate with basis for expected (FIFO queue, batch average, serial rate, reconciliation).
Add permission checks from the bug reviews
Permission findings from bug reviews added systematically across multiple doctypes.
Request for Quotation and Supplier Quotation bug review fixes
RFQ and Supplier Quotation workflow and comparison report bugs fixed across 16 commits.
Maintenance Schedule and report bug review fixes
Maintenance Schedule, Visit and report permission and calculation bugs fixed.
Procurement Tracker and subcontracting report bugs
Tracker and subcontracting report edge cases and calculations fixed.
Quality Management bug review fixes
Corrective action and other Quality module bugs fixed with individual commits per issue.
Project bug review fixes
Project status transitions now validate correctly and other project flow bugs fixed.
Timesheet bug review fixes
Timesheet and Sales Invoice row billing edge cases corrected.
Buying Settings and Supplier bug review fixes
Buying Settings and Supplier permission and validation bugs fixed.
Task bug review fixes
Task dependents never rescheduled and other task workflow bugs fixed.
Reject stale standing part in Supplier Scorecard
Supplier Scorecard bugs fixed: status calculation, period windows and other edge cases now correct.
Guard acc_frozen_upto reads in pre-v16 patches
Three old patches crashed on develop when they read removed Accounts Settings field; now guarded with existence check.
Skip reporting-currency conversion when no reporting currency is set
v14 migration crashed with ReportingCurrencyExchangeNotFoundError when company had no reporting currency; now skips conversion.
V15 asset depreciation schedule patch on current develop
v15 migration crashed when it called removed helper function; now uses current API with same field mapping.
Validate material request transfer warehouses
Material Request transfer had no warehouse validation, allowing mismatched from/to warehouses; added validation.
Include child territories and groups in Inactive Sales Items report
Territory filter matched the invoice's own territory only, missing child and group territories; now includes all descendants and ignores credit note returns.
Scope accounting dimension defaults to the asset's company
Every company's dimension settings applied to asset entries, so another company's mandatory field stamped values that failed validation; now scoped to the asset's company.
Honour Price Not UOM Dependent in transactions
Price list flag had no effect because code read a key that never existed; now uses the correct key.
Fix two develop tests broken by crossed merges
Tests written before a validation merged failed on develop; now follow the correct flow that the validation allows.
Keep a task in its parent task's project
Duplicated projects left child tasks pointing at the original parent's project; now updated to point at the copied parent.
Bill the remaining amount after the full qty is billed
SO rows with milestone billing (full qty at lower rate) could not bill the remaining amount; mapper, picker and button now count full qty as billed.
Convert PO amount to company currency for budget validation
Foreign currency POs compared against budget without rate conversion and bypassed Over Budget check; now multiplied by order rate.
Check overproduction only on the job card's operation
Lowered overproduction allowance on one operation blocked all others in the Work Order; now checks only the Job Card's own operation.
Do not allow finished good qty above finished good quantity
Manufacture entries with finished good rows raised above the entry qty bypassed validation; now checked against both process loss and entry qty.
Publish prebuilt assets for Pilot
Frappe assets built in CI and published across develop, version-16 and hotfix branches for Pilot benches.
Add dedicated "Add Roles" and "Remove Roles" bulk actions
User list view now has safe "Add Roles" and "Remove Roles" actions that append or strip roles without overwriting existing ones.
Sort tree view nodes alphabetically
Tree view toolbar now has a Sort dropdown for client-side alphabetical sorting of tree nodes.
Add frappe.ui.BottomSheet for phones
New phone-friendly bottom sheet component with steps, auto Back button, drag to resize or dismiss, loaded on demand like chart components.
Child table links hide direct links on the same field
Reverse relationships with same fieldname kept only child link in automation picker; now includes both with deduplicated names.
Worker re-registration when Redis key expires
Worker registration expired in Redis if heartbeat missed TTL; now re-registers on heartbeat to stay visible.
Review bot posts the same review twice when dispatched twice
CI dispatch race condition caused duplicate review posts; now protected against concurrent posts.
Download with more relevant filename
Print download filename improved when print happens via printview API.
Query recorder leaves sql on connection, breaks later tests
Query capture in tests failed after recording or assertRowsRead left sql on connection; both now clear it.
Release fixes for the print format builder
Missing format no longer shows blank page, letter head footer positioning fixed, page breaks and table defaults corrected for release.
Field list spacing and search box size in print format builder
Print format editor left panel had spacing and sizing inconsistencies; fixed search box height, field row height, group divider spacing.
Int field used as the document name becomes a string
autoname with Int field turned `3` into `"3"` on save; with set-only-once the second save failed with "Value cannot be changed". Name now converted to field type.
Keep sites before the setup wizard on Apps
Standby sites upgraded ahead of signup were pinned to desktop icon grid and shown the "try new navigation" banner; now left alone until setup wizard completes.
Restore pre-upgrade workspace edits from version history
v16→v17 upgrade re-imported workspaces and lost all custom edits; now offers `/desk/workspace-restore` to rebuild edits as Custom Workspaces.
Add icons to top-level sidebar links missing one
Top-level sidebar links in Contacts, Geo and other shipped sidebars rendered with empty icon slots; added icons for all.
List custom modules in the block-module editor
Custom modules without an app never got checkboxes and were quietly unblocked on form save; now listed and checkboxes work.
Fix print format editor fixes for missing formats, footer position and layers
Opening editor for deleted format showed blank page; footer appeared at content bottom instead of page bottom with repeat off; header/footer zones unnamed in inspector.
Use indexed modified column in large table check
Meta rebuild queried creation column without an index on v15; now uses indexed modified column to avoid full table scan.
Run automation drains at read committed
Repeatable-read snapshot made TimestampMismatchError retry reread stale rows; MariaDB 11.6+ rejects locking read outright. Drains now run at READ COMMITTED.
Table in a dialog ignores read only
Grid outside a form treated tables as editable even when read_only was set, and toggling it back failed; now respects read_only flag.
Open count link drops the document filter on the list
Clicking a dashboard's open count routed to the list twice and the second route dropped filters; now routes once with both filters.
Currency field keeps the old precision after the currency changes
Rows added under one currency dropped decimals when the document's currency changed; control now reads current currency on every save.
Publish prebuilt assets for Pilot
HRMS assets built in CI and published for Pilot; frontend and roster SPAs declared in bench.assets.
Module onboarding, documentation links and icons
Each HR module workspace opens with first-transaction onboarding; DocTypes and reports now link to documentation; Lucide icons and sidebar refinements added.
Setup Shift Schedule duplicate assignment on end date
Repeating Shift Schedule ending on schedule week's last day created final assignment twice; now resets start date after end-date insert.
Add hook for module redirection
HR module needed code-only hook declaration so custom HR Setup heir can handle navigation and dock entry.
Resolve conflicts in CheckInPanel
Merge conflict markers left in CheckInPanel broke CI check; resolved.
Remove old salary slip print formats
Old salary slip formats superseded by Classic/Detailed/Compact; patch deletes them and migrates links to replacements.
Improve validations in interview workflows
Interview form validations apply to workflow documents; improved error messages and edge case handling.
Allocate leaves left in annual quota instead of skipping allocation
Earned Leave Schedule rounded up and exceeded quota, skipping later periods and throwing errors; now capped to annual allocation.
Publish prebuilt assets for Pilot
CRM assets built for main branch against Frappe version-16; Pilot benches download instead of building on install.
Add trailing semicolons to ERPNext doctype_js scripts
Missing semicolon at end of doctype script let next script's array literal run as previous statement; added trailing semicolons.
Deal contact organization filter
Contact dropdown listed every contact, ignoring the Deal's Organization; now filters by organization and lets users set company_name from the deal form.
Show the call's referenced lead or deal instead of a phone number match
Call log contact name came from phone lookup even when the reference document was available; now reads from reference first.
Keep the time of day and site time zone in the Meta lead sync window
Meta lead sync skipped leads created between site midnight and UTC midnight on sites ahead of UTC; now converts to Unix timestamp and preserves time of day.
Link self-hosted sites to the Payments repo, not the marketplace
LMS Settings Payments missing warning now links to GitHub repo for self-hosted, Frappe Cloud marketplace for Frappe Cloud.
Let Course Creators manage the batches they are tagged on
Course Creators now edit tagged batches, enrol students and run live classes; cannot create/delete batches. Moderators create and tag them.
Restrict who can assign a badge
Only staff roles can create LMS Badge Assignment; automatic awarding still works so students get earned badges.
Show the server's message when a course import fails
Course import toast showed exception class but dropped the reason; now reports server's error messages.
Limit what a course archive can create
Course imports ran permission checks only on first insert; now run normal permissions for Course Evaluators and keep only existing users and evaluators.
Publish prebuilt assets for Pilot
Builder assets built in CI and published for Pilot on develop and master branches.
Add frappe-builder agent skill
Coding agents (Claude Code, Codex) can now manage Builder sites via frappectl; one tool for sites, pages and components; settings > agents shows one-line prompt.
Drop weak-model handholding from Bob's prompts
AI generation prompts had weak-model guards; refactored to sentence case without em dashes and added AI-tells rule to catch stock phrases.
Publish prebuilt assets for Pilot
Insights frontend SPA built in CI and published for Pilot benches.
Read a dashboard's span as the Period of a Number card that states none
Number cards now read dashboard `within` span as Period so comparison has previous span to step back from, fixing comparison on adhoc filters.
Revive clamav
ClamAV file scanning service restored on servers for virus detection.
Queue Deploy Now on the build queue
Deploy Now jobs sat queued behind the long queue backlog; now queue on build queue like Release Pipeline does.
Reject control characters in environment variables
Newlines in environment variables broke Dockerfile rendering and executed arbitrary directives; now validated on save and before rendering.
Move frappe apps to their branch heads and add whatsapp
Registry updated: 17 frappe apps now point to branch heads; whatsapp app added since crm develop depends on it.
Stream remote backup files into the site
Remote site restores now stream file archives into tar instead of copying to disk; idle tasks send heartbeats so long restores don't block Admin.
Publish prebuilt assets for Pilot (version-16)
Blog assets published for version-16 branch and Pilot benches.
Publish prebuilt assets for Pilot
Blog assets built in CI and published for Pilot benches on develop and version-16.
Classify incoming mail by its headers
Mail sorted into Primary, Promotions, Social, Updates and Forums from headers on first fetch; category stored as keyword on server.
Publish prebuilt assets for Pilot
Lending assets built in CI and published for Pilot; benches download prebuilt archives and skip asset build.
Send Pilot telemetry as pilot-common-config
Central telemetry settings now sent in pilot-common-config metadata format; Pilot merges into common_config.toml for cleaner config management.
Send a common site config to every new server
Central Settings Common Site Config JSON field sent to every server at bootstrap so apps get settings on install or later.
Apply config patches from instance metadata
Central can set any key in common_config.toml, bench.toml or common_site_config.json via instance metadata without Pilot code changes.
Sign in trial owners and keep one address for trial sites
Trial owners now sign in as themselves with token from Pilot; site can be renamed and Central provides team identity token.
Run the Ansible pinned with the app, not the host's
Verify SSH failed with host Ansible too old; now runs Ansible pinned with the app.
Hold Ansible at the 12 line so Ubuntu 20.04 nodes work
Ansible-core 2.20+ requires Python 3.9 but Ubuntu 20.04 has 3.8; pinned to ansible 12 line with ansible-core 2.16.
Install the static stalwart-cli so Ubuntu 20.04 nodes can bootstrap
Ubuntu 20.04 glibc too old for gnu stalwart-cli; now downloads musl build which is statically linked.
PDF loading state for public PDF embeds
PDF embeds showed empty strip until PDF.js rendered; now show page-shaped skeleton during load.
Wiki v3 on Frappe v15 support
Wiki v3 only ran on v16+, failing install and migration on v15; now one codebase with API detection for both versions.
Skip lowercase component names in build, treat them as native elements
Build tool incorrectly treated lowercase component names as Vue components; now skips them as native elements.
Pre-bundle every prosemirror package so TextEditor and frappe-ui/editor share one copy
ActivityTimeline failed to load in dev with duplicate selection JSON ID error; now bundles prosemirror to avoid duplication.
Clear loan closure_date when a closing repayment is cancelled
Cancelled payment left closure_date on loan so it looked closed despite amount due; now clears the date.
Tuesday, October 6
Allow group warehouse for raw material availability in production plan
Add optional Raw Material Group Warehouse; sum availability across children while receiving into For Warehouse.
Project UX cleanup
Improve Project form: regroup timeline fields, bring tasks into the project, allow task assignment, improve portal users section.
Enforce UOM restrictions in sales and purchases
Apply UOM conversion rule in Item defaults and transactions when "Allow UOM with conversion rate" is on.
Raw material group warehouse fixes in production plan
Prevent For Warehouse from being the group itself; count group stock once; fix custom warehouse search.
Allocate only the untransferred qty of reserved batches
Return untransferred qty from get_reserved_materials instead of full qty after partial transfers.
Allocate reserved batches up to the requested qty
Distribute reserved batches to the requested qty instead of always transferring the full reserved amount.
Count a split batch once across work order reservations
Count each reservation's share of a split batch, not the full moved qty.
Fetch BOM rows in stock UOM when getting items
Return BOM rows in stock UOM without extra UOM/conversion-factor fields to prevent double conversion.
Use imported query functions in scorecard variables
Fix AttributeError in Supplier Scorecard variables by importing query functions instead of using frappe.qb.fn.
Apply company restriction in standard cost item query
Apply Item company restrictions when picking items for Standard Cost.
Clear advances from invoice returns
Remove advance allocations from credit notes instead of copying invalid rows.
Validate Delivery Note return rows without dn_detail
Check unlinked return rows against item's total delivered qty; throw if item not in original.
Keep Include Closed Orders out of the other trends reports
Prevent Include Closed Orders filter from leaking between trend reports via shallow-copied shared filters.
Procurement Tracker actual cost in company currency
Show Procurement Tracker actual cost for uninvoiced lines in company currency, not order currency.
Serial and batch fixes for subcontracting inward returns and consumption
Fix serial and batch allocation and validation in subcontracting inward returns.
Subcontracting Inward Order bug review fixes
Fix batch-wise and serial-wise return validation for subcontracting inward orders.
Split shared invoices over all their sales orders in payment terms status report
Divide invoice amounts correctly between all sales orders when one invoice covers several orders.
Clear client supplied content hash for remote files
Ignore client-supplied content hash for remote files since they have no real hash.
Enforce Desk User read permissions on attachments
Hide the add attachment button from users without write access.
Int field used as the document name becomes a string
Convert Int-field document names to the field's type before set-only-once checks.
Drop the duplicate Logout from the apps screen menu
Remove stray Logout entry that was duplicated during backport conflict resolution.
Letter head, version history and print page fixes
Fix letter head editing, version history sidebar, and print page in the print form builder.
Letter head Based on toggle switches to Image
Show the image upload when picking Image for a letter head with existing HTML content.
Make a11y: make learner pages usable by keyboard and screen readers
WCAG 2.2 AA audit fixes: video controls visibility on focus, proper buttons for keyboard navigation, screen reader support.
Change all batches tab to active and implemented dynamic title name
Replace "All" tab with "Active" for admins and make page title reflect selected tab.
Preview state styles during canvas drags
Canvas drag handles now read and write the active state style instead of falling back to base style.
Offer the latest models in AI setup, drop the cheap tiers
Refresh Builder's AI model list to include Claude Sonnet 5.5, Opus 5.5, Fable 5.1 and the latest OpenAI/Google models.
Ask before saving a client script shared by other pages
Prompt to update all pages or save as copy for this page when editing a shared client script.
Fix page editor Cmd/Ctrl+S to save a version
Add a dialog offering to save the current state as a version; repeat presses save directly with a toast.
Drop the stale Builder Component connection on client scripts
Remove the Builder Component connection backed by a table that was already deleted.
Give copied client scripts a fresh hash instead of appending one
Swap trailing hash chain for one fresh hash when copying pages to avoid name bloat.
Keep newly drawn text block in edit mode
Ignore outside clicks while in text mode so the trailing mouseup click doesn't clear the new block.
Keep canvas history tracking resumable when a batched callback throws
Wrap history resume in finally block so undo/redo tracking resumes even if batch callback fails.
Remove add-on service
Replace Add-on Service DocType with a Select field on Team Service.
Take site links from the www/sitemap page instead of rebuilding frappe's
Let app sitemap overrides take effect by reading site links from the page instead of rebuilding.
Add frappe-wiki-skill agent skill with wikictl helper
Add skill and stdlib-only CLI for agents to edit wiki pages over frappectl.
BMC support for generic provider
Add Baseboard Management Controller (Redfish) support for generic Atlas provider: power state, boot options.
Extensible routing and boot data
Add thin abstraction layer for app routing extensions, aliases, guards and router options.
Pre-bundle prosemirror to avoid breaking TextEditor in dev mode
Pre-bundle prosemirror and remove frappe-ui from optimizeDeps to fix TextEditor in dev.
Theme-aware canvas and color-scheme for rendered apps
Set color-scheme and page background to match browser dark mode; fix iframe backdrop color.
Focus the invite email and dialog-hosted forms
Apply autofocus to the invite email input and first text input in dialog-hosted forms.
Focus the first text input of forms and dialogs
Set autofocus on first text input in auth pages and form dialogs.
Monday, October 5
Default import template fields and descriptions for common DocTypes
Common ERPNext doctypes now have default import fields and user-facing descriptions.
Map raw material serial / batch to finished good serial / batch for traceability
Serial and Batch Traceability report now maps raw materials used in production to the finished goods they became, enabling accurate supplier recalls and customer traceability.
Convert PO amount to company currency
Over Budget restriction was not enforced on purchase orders in foreign currency.
Check tax template access in get_taxes_and_charges
Validates read access to tax templates before returning them for forms.
Check read on purchase document in get_values_from_purchase_doc
Validates user can read the purchase document before filling asset details from it.
Default import template fields for Address, Contact and User
Default import fields are now defined for Address, Contact and User doctypes.
Shared pages open in any shell, system pages in none
Pages now open in the shell they were launched from (e.g. printing an Item from Stock opens the Stock shell) instead of always using their module's shell; system pages open without a shell.
Run an expanded group's rule under its icon
Expanded group's connector line ran near the icon's left edge instead of under its centre; alignment is now correct.
Show Import on an empty list even when filters are set
Import button was missing on empty filtered lists; it now appears on filtered and unfiltered lists.
Bring the Desktop Icons grid up to v16 and onto the Apps screen's look
Sites using Desktop Icons mode were seeing an old unstyled icon grid; icon grid now extends the Apps page class and shares its styling.
Nest sublists indented by 2-3 spaces
CommonMark-style list nesting with 2–3 spaces was breaking numbered lists; showdown now accepts CommonMark indentation.
Number card shows NaN for a zero value when currency is set
Number cards with zero values and currency formatting displayed NaN instead of 0; report cards with no aggregate data now show N/A.
Restore frappe's desktop icons on version-16
Desktop icon JSON files were deleted during v16 polish, causing migrate to remove them as orphans and lose all desktop folder navigation.
Keep spacers and skip item groups in the v16 conversion
v16 sidebar migration aborts on Spacer and Sidebar Item Group rows; conversion now skips unsupported types instead.
Split progress bar for the AI setup steps
AI settings now uses a frappe-ui Progress component with three segments instead of tab buttons for the Provider / Connect / Models setup flow.
List only indexable Builder Pages, skip redirects, home page at the site root
Sitemap was listing all Builder Pages including disabled and login-only ones; now respects Builder's indexing rules.
Deploy a scheduled group now from its row
Scheduled Deploy Settings rows now have a **Deploy Now** button to deploy a group immediately instead of waiting for its scheduled hour.
Track how fast sites adopt new deploys
Site Adoption Snapshot doctype tracks each site's current bench, filled hourly and kept for 30 days; identifies which sites are stuck and how fast rollouts spread.
Allow Pilot to download backups after team approval
Pilot can request access to Frappe Cloud v1 site backups; a team member approves with a passcode and Pilot gets 12 hours to download them.
Deploy bench groups on a schedule from settings
Scheduled Deploy Settings doctype lets operators define bench groups and their deploy times instead of editing server scripts; deploy schedule is now visible and auditable.
Theme-aware images with caption, align and resize
Wiki editor images now support captions, left/centre/right alignment, separate light/dark mode images and resizing via corner grip.
VM Metrics
Collect VM CPU, memory, disk and network metrics on Metal every 10 seconds; retain seven days of daily JSONL history locally and serve on demand through Metal and Atlas APIs.
Bucket VM metrics by max samples
VM metrics requests now return at most 300 samples by default; buckets are sized per range so every request returns a consistent chart-sized response.
Restore a site from a Frappe Cloud v1
Restore dialog now includes Frappe Cloud v1 as a source for site restoration.
Show display names instead of internal IDs
Notifications, billing rows and customer copy now use display names instead of internal record IDs and service names.
Show server IDs, group the menu and open servers from Pilot
Server list and overview now show Atlas VM IDs; server menu is grouped by action frequency; servers can be opened from Pilot console links.
Link Central entries to this server in Central
Admin dashboard now links to this server's overview and resize dialog in Central.
Stabilize Pilot and add restore, branch switch and site actions
Admin dashboard now supports restore, reinstall, build assets and branch switch operations; fixes stability issues and closes 20 open issues.
Fix admin port, proxy scheme and Socket.IO origin
Admin site returned 502 errors in Supervisor mode using the wrong port; Socket.IO now works behind HTTPS reverse proxy.
Send event_type and reference_name in pilot events
Pilot was sending wrong field names for events (sending `event` instead of `event_type`); Central now receives and deduplicates alerts correctly.
Keep the table still and fit snapshot columns
Selection bar now replaces search row instead of pushing the table; snapshot columns now auto-fit to content width.
Preserve preferred affinity fallback during resize
Resize with affinity matching was skipping the Preferred fallback; nonmatching servers with capacity are now available as fallback.
Accept resource limit alerts from pilot
Adds missing Notification Event Type for `resource_limit_breached` alerts so Pilot resource warnings reach teams.
Going back to all spaces resets the filter to published
Chosen filter was not remembered when navigating back to All Spaces; filter now persists for the browser tab.
Make terminal text selection visible
Setup wizard terminal text selection was invisible due to black selection highlight on the dark terminal background.
Preserve disk cleanup after cancellation
Failed disk create rollback was skipped if the request context was cancelled; rollback now continues independently.
Prevent resize deadlock
Resize and network update could deadlock; resize no longer holds the allocation lock since capacity comes from the host.
Validate restored node numbers
Peer restore now rejects node numbers above 65535 that would overflow the client address field.
Sunday, October 4
Add Designation column in Lead Details report
Lead Details report now shows Designation field.
Add Designation column in Address and Contacts report
Address and Contacts report now shows Designation field.
First-transaction onboardings, Setup as home, simpler sidebars
Module onboardings now center on the first real transaction, Setup becomes a module on Home, and sidebars are simplified for each area.
Take POS change off one payment row per invoice
POS change calculations now apply correctly when multiple payment modes exist and accounts change mid-shift.
Recalculate totals when adding time log rows
Timesheet totals now update automatically when rows are added or duplicated.
Improved setup wizard
Setup wizard is redesigned, apps can show custom help text, and analytics track per-step progress.
Add label_position option to Stepper
Stepper component now supports label positioning at "right", "left", "top", or "bottom".
Server-side jinja rendering for report printing
Report print formats can now be written in Jinja instead of the browser-side JS engine, with access to any server data.
Onboarding on workspaces, calmer cards, chart empty states
Onboarding displays as a block on workspaces, steps tick off only when complete, and optional steps don't hold up completion.
Solve issue in checking js in pdf
The utility function for detecting JavaScript in PDFs now works correctly.
Store currency number format without sql escaping
Currency number formats no longer store SQL escape characters, so formatting works correctly across databases.
Link to an unreadable doctype reports an error about page
Opening a desk link to an unreadable doctype now shows a permission error for the doctype, not a confusing error about Page.
Resolve a declared package in an app file through vite
App files can now import packages declared in `desk.package.json` through Vite resolution.
Avoid unavailable is_empty in v15 multiselect
V15 multiselect validation now uses a compatible check instead of the unavailable `is_empty` utility.
Add accessible names to unlabelled controls and images
Screen readers now announce alt text for images, aria-labels for buttons and inputs, and proper tab order.
Emailed prints ignore the chosen print language
Email queue prints now respect the selected print language instead of resetting to the sender's language mid-print.
Prints attached in a background job ignore the user's language
Attached prints from background jobs now use the job user's language consistently instead of falling back to stale English.
Group by sums show foreign amounts in company currency
Grouped sums now show without a currency symbol when they mix multiple currencies, preserving symbols only for single-currency groups.
Preserve literal values in list view filters
Clicking a list cell with `User` or `Today` no longer resolves to the logged-in user or current date; only indicator filters resolve these special values.
Bump PyPika to fix arithmetic with Table and subquery operands
Restore arithmetic operations on Table and subquery objects, which crashed with "Field object is not callable" in ERPNext queries like `has_potentially_billable_items`.
Correct currency minor units and Angola's currency code
Fix currency configuration so zero-decimal currencies (JPY, KRW, etc.) and JOD format correctly in `money_in_words()`.
Keep generated columns out of deleted-field cleanup
Schema sync no longer drops database-generated columns, which were incorrectly treated as deleted user fields.
Stop caching data-dependent dynamic links
The Links dialog now finds newly-created dynamic links instead of hiding them until the doctype cache is cleared.
Ignore lft, rgt and old_parent sent by the client
Tree structures now reject stale client values that could corrupt nested set bounds when a tree changes during an edit.
Restrict get_email_html preview to System Manager
Require System Manager permission for the email preview endpoint to close an admin-only API exposure.
Don't load virtual single doc for doctype permission check
Stop instantiating virtual doctypes during permission checks to prevent recursion that enqueues background jobs and crashes the queue when overloaded.
Drop the border around non-assessment lesson embeds
Embedded videos and media no longer show a 1px outline; assessment blocks keep their border.
Render and save an assessment block on insert
Embedding a quiz in a lesson now renders and saves correctly instead of appearing blank until refresh.
Put the cursor in Title when adding a chapter
The cursor now focuses the Title field when "Add chapter" opens, on desktop and mobile.
Upgrade to debian trixie and support openshift arbitrary uid
Docker images now use Debian Trixie and support OpenShift restricted-v2 with arbitrary non-root UID.
Show page views in a meta line under the title
Page reading time, views in the last 30 days and last edit now show in a line under the title; clicking views opens analytics.
Misc improvements
Web console and SSH now work for every image, SSH keys are optional, and server creation shows progress in the button.
Accept a plan's transfer row on resize
Server resize from the console now passes validation and logs failures with full traceback.
Grant temporary host access through Warpgate
People get temporary SSH access to Metal hosts through one Warpgate per region; Central grants and revokes access through the Atlas API.
Move Atlas management traffic to private WireGuard
Atlas now manages Metal hosts and service VMs only through WireGuard on the provider network; no management traffic on public addresses.
Give customer devices WireGuard access to tenant VMs
Customer devices reach private VM addresses through a replicated cluster of WireGuard gateway nodes, registered through a Central endpoint.
Close a person's Warpgate sessions through the API
The API now closes every live Warpgate session of one person, HTTP and SSH; Central uses it when admin access ends.
Add warpgate sign-in and host access grants
Central is now an OpenID Connect provider so operators can give time-limited SSH access to region hosts through Warpgate.
Enhanced sign in and sign up
Every email now gets a 6-digit code; known emails sign in, new emails become accounts after verification.
Bulk invite
Team admins can now invite up to 10 people at once from the team page, each with a role and resource.
Send clear invitations and upload profile and team images
Team invitations now email directly with an accept button, and users can upload profile and team logos.
Create the first team in console onboarding
New users now name their own team in an onboarding dialog instead of getting an automatic personal team.
Replace host access grant with warpgate access
Warpgate Access replaces Host Access Grant, giving time-limited access to one host, all hosts, or the Warpgate admin UI.
Publish the API reference and a generated client
The docs site now publishes the WireGuard gateway API reference and a generated Python client.
Close all live Warpgate sessions on revoke
Revoking host access now closes all open SSH sessions immediately instead of blocking only new sessions.
Keep caption streams alive through audio inactivity
Caption decoder and STT connections now wait for resumed audio instead of restarting on RTP inactivity.
Use isinstance for the Interval arithmetic override
Query arithmetic now checks types correctly instead of using hasattr, which falsely matched Table and QueryBuilder objects.
Make the Atlas VM safe to upgrade and stop
The Atlas VM runs the Node.js realtime server, setup updates existing Atlas apps, and stop shuts the guest down cleanly.
Reset the idle clock when a VM starts
Metal now restarts the idle clock when a VM starts, so a sleepy VM gets its full idle timeout after each start.
Fix Warpgate start and Atlas VM kernel upgrade
Warpgate now owns its configuration and Atlas VM setup stops with recovery instructions when the kernel is too old.
Update the Warpgate atlas role on every setup
The Warpgate installer now updates the `atlas-sync` role on every run, so running regions get new permissions without a full reinstall.
Treat a missing route as already deleted
WireGuard Mesh treats missing routes as deleted, so reset and VM removal can recover from partial failures.
Thursday, October 1
Allow bulk edit on transaction child tables
Older DocTypes now have bulk edit enabled on their child tables.
Add consolidated summary reports to the accounts sidebar
Consolidated summary reports now appear in the Accounts sidebar.
Add standard Kanban boards for common doctypes
Beautiful default Kanban boards for common ERPNext doctypes.
Add standard list layouts for common doctypes
ERPNext ships default list layouts for common doctypes, visible only in Developer Mode, with pre-configured column filters.
Preload only the postgres driver in test shards
Postgres shards failed because Frappe preloaded MariaDB driver by default. Now preloads only the configured driver.
Keep allocation selection in the unreconcile dialog
Unreconcile dialog's read_only flag on allocations table disabled row selection. Cells stay read-only through child fields instead.
Set opportunity_type default via set_value for translated doctype
Opportunity type default was not translated across languages on creation.
Accounting dimension shows in connections tab on stock entry, asset
Stock Entry and Asset forms lacked the `dimension_col_break` field, so accounting dimensions dropped to the Connections tab. Renamed their break to match other doctypes.
Add a tooltip explaining "Represents Company" on Supplier and Customer
The Represents Company field (for inter-company transactions) had no explanation. Now has a tooltip.
Validate Journal Entry account belongs to Company on save, not just submit
Journal Entry validation only checked account-company mismatch on submit, leaving mismatched drafts in place. Now validated on save.
Skip pricing calculations for RFQs
Changing quantity on RFQ items triggered pricing calculations for fields that don't exist on RFQ items. Now skipped for RFQs.
Filter reservation warehouses by company
Stock Reservation warehouse dropdown listed warehouses from other companies. Now filtered by company.
A return visit after a script or DocType change paints the old version, then the new
Return visits after Client Script or DocType changes now paint the old version from cache, then refresh with new schema on the background read.
Much better looking email composer
Redesigned email composer with improved UI.
Pin the dock by default
Dock now starts pinned beside the sidebar instead of floating. Existing users keep their setting.
The feed store lives as long as the record's cache entry
Activity feed stores now live exactly as long as the record's cache entry, preventing orphaned stores and keeping memory usage predictable.
Paint a returning list from the shared cache
Return visits to lists and saved views now paint from the shared cache with no skeleton, reading again quietly in the background.
The currency lookup reads linked currencies from the shared data cache
Currency fields reading from linked records now use the shared data cache, so changed linked currencies show on next visit and on record save.
OnOpen, a Client Script handler that runs once per visit
Client Script `onOpen(page)` handler runs once per visit after first replay, not on replays, for setup-only logic.
Page.cached, server data a Client Script reads without a second paint
Client Scripts can export `onRefresh(page)` to read and cache server data without a second repaint on return visits.
The record page restores its view on a return visit
Record pages restore their tabs, scroll positions, and Details form tab on return visits, both within and across app navigation.
Default list layouts shipped by app
Apps can ship default list layouts for their doctypes, visible only in Developer Mode.
New kanban board
Configurable Kanban board for any DocType, opt-in via a Kanban Board setting. Card fields, display format (icon/text), and grouping are customizable per board.
Navbar menu button shows no icon on mobile
Website navbar menu button showed an empty box on mobile. Lucide icons need stroke; old CSS rules hid it.
Minor UI fixes
Empty states in global search, Espresso buttons in layout manager, single connection toast, avatar fallback in email composer, truncated badge labels, docs links in dropdown menus.
Postgres fixes (multiple)
Scope site role access to its own database, fix column type changes, persist manual indexes, fix query builder and Engine issues, keep index names in sync, and let managed root drop databases.
Keep a site's own board on sync and allow a DocType's hidden title
Sync replaced a site's own Kanban Board with a shipped one of the same name. Now skips if a non-standard board exists.
Header size for sidebar header
Lucide icons in the sidebar header looked incorrect. Replaced with better-sized icons.
Keep tab remove button inside the tab strip
Form Builder's tab remove button overflowed the tab on hover, causing unwanted scrollbars. Now positioned inside.
Form shows stale defaults and saves them back
System Settings form showed database defaults instead of saved values on load, then saved them back, reverting manual changes like timezone corrections.
Show separators in non-Mac menu shortcuts
Espresso menu migration removed separators from keyboard shortcuts, showing `CtrlE` instead of `Ctrl+E` on Linux and Windows. Restored with regression test.
A kept feed store no longer keeps the page that built it
Activity feed store kept entire record pages in memory even after navigation. Idle stores now release when the record's cache entry leaves.
Check write perm. on attachment
File attachment deletion did not verify write permission on the attachment.
Show linked ERPNext quotations in a deal tab
Quotations tab on Deal view lists quotations linked to the deal, with live refresh for same-site and remote ERPNext.
New whatsapp integration
Replaces community WhatsApp app with official Frappe WhatsApp integration on CRM.
Command palette stale search and lost lead conversion
Command palette search results stayed stale on navigation, and lead-to-deal conversion was lost.
Send qualified follow up only on qualification
Workflow automation sent qualified follow-ups on unrelated state changes.
Pinned comments
Agents can now pin up to 5 internal comments on a ticket. Pinned comments show in a bar under tabs, newest first.
Name a reply sent from a shared email after the agent
Agent replies sent from a shared email flipped from agent name to email owner once the server row loaded. Timeline now consistently names the reply after the agent.
Register the assessment permission pair
Quizzes, assignments and programming exercises now have list and document permission hooks, scoped through lesson embeds or batch enrollment.
Keep students off assignment list pages after redirect
Student access to `/assignments` and `/assignment-submissions` was redirected to Courses, but filter hydration immediately cancelled that navigation.
Put a question's explanation fields behind permlevel 1
Question explanation fields were hidden only in the UI. Now gated behind a permission level so students cannot read them before attempting.
Scope batch evaluator writes on LMS Certificate
Batch evaluators could create, edit or delete certificates for any course, not just their assigned ones. Now scoped to evaluator's courses and batches.
Find a Data Store table whose name holds regex characters
Table name lookup used unescaped regex, so tables like `orders_(eu)` were not found on append/upsert imports.
Keep an appended table when the Data Store cannot list its tables
Data Store append imports treated `list_tables` errors as "no table exists" and overwrote the table. Now propagates the error.
Add a date filter to site jobs
Site Jobs page now has a Date filter with presets (Today, Last 7/14/30/90 days) and custom range picker.
Add Build Server Stats report
New script report showing one row per build server and registry server, with throughput, load, and IO metrics for operators to monitor builds.
Daily Raven digest of sites with no backup attempt
Companion digest surfaces sites due for backup that the scheduler never picked up, complementing the existing failed-backups digest.
Daily Raven digest of sites whose backups keep failing
New daily server-alerts digest lists sites that hit the daily failed backup limit. Same as the team email but in one message.
Make the restore tables confirm button black, not red
Restore Tables dialog's red confirm button signaled error instead of recovery. Changed to black to match recovery intent.
Log the server activity once per incident, not per run
Incident logging fired every 2 minutes for the life of a confirmed incident instead of once. Now deduplicated by job tag.
Send failing and missed backups as one Raven message
Daily backup failure alerts were sent as two separate Raven messages. Now consolidated into one with two tables.
Warn that backups may fail when the disk is full
Disk full banners only mentioned sites may stop responding, missing that backups also fail, leaving data unprotected.
Show frappe storage provider in case pilot is central enabled
Pilot now shows Frappe storage provider when Central is enabled.
Bring credit-funded provisioning into v0.2
Teams can create servers while credits cover the cost. Billing details only needed when credits run out.
Overflow of long ahh status in PWA
Long status messages overflowed in the PWA.
Allow lower-resolution cameras
Desktop camera capture required 960 × 540 minimum, causing OverconstrainedError for lower-res cameras. Now requests 1280 × 720 preferred but accepts any supported resolution.
Label the funnel tooltip value with its stage
Funnel chart tooltips showed "Value 741" instead of the stage name. Now labeled "Active 741".
Print a second axis' data labels in its format
Chart data labels printed in the series' format, not the axis', so a right-axis percent showed `0.3` next to a `30%` tick. Labels now use their axis' format.
Typing lag on large pages
Editor lag of 2–3 seconds on large pages caused by repeated tokenizer registration, triple markdown parse per keystroke, and inline base64 images. Now uses per-editor marked instance and external image storage.
Address Greptile review on #818
Sidebar navigation retained robots tag from previous page, page views logged wrong URLs, and analytics ingest held exclusive locks. Fixed all three.
Wednesday, September 30
Dual-tone module icons for the dock and sidebar headers
ERPNext modules now have two-tone dock icons that animate on hover, matching the sidebar header.
Respect serial / batch activation in stock settings and item
Disabling serial/batch activation now hides dependent settings and blocks Item enabling.
Value batch and serial returns at the receipt rate
Subcontracting receipt returns of batch/serial items now post at the correct value.
Validate combined material request quantities
Material Request validation now prevents multiple rows for the same Production Plan item from exceeding remaining qty.
Planned qty zero validation in production plan
Production Plan items now reject zero or negative Planned Qty values.
Surface download errors and guard no-data statement in Process Statement Of Accounts
Report now handles download errors gracefully and prevents crashes when no data is returned.
Check duplicate items on purchase invoices without update stock
Duplicate item check now runs on every Purchase Invoice instead of only when Update Stock is on.
Check item access and map pending quantities
Supplier lookup now checks item read permissions, and partial orders now use remaining qty instead of full qty.
Enforce party specific item restrictions on save
Party Specific Item rules now block saves with disallowed items instead of only filtering the search.
Allow component returns only on completed or closed work orders
Component returns are now server-side validated to occur only on completed or closed work orders.
Net work order returns off transferred materials
Work order component returns now reduce the WIP balance instead of adding a second balance in the source warehouse.
Consume batches from every transfer in manufacture entries
Manufacture entries now consume batches from all transfers instead of only the last one.
Skip batch qty reserved by other vouchers in manufacture entries
Manufacture entries now cap transferred batch qty at unreserved amounts when stock reservation is on.
Prevent duplicate serial and batch reservations
Work order and subcontracting reservations now enforce allowed qty checks and count all reservations to prevent duplicates.
Guard against missing customer in Item-wise Sales Register
Report no longer crashes when an invoice row's customer doesn't resolve to a Customer record.
Prevent transfer value drift
Stock value drifts are prevented by including additional cost in transfer valuations.
Value a transfer's inward leg at what left the source
Material transfers no longer leave rounding differences in Stock Adjustment by valuing inward at the actual outbound value.
Validate material requests before creating work orders
Work order creation API now validates read permission and enforces Material Request type and status restrictions.
Postgres CI failures in session hash and backup tests
Two flaky Postgres tests fixed: session hash lookup and backup timestamp ties.
Show the desk architecture at /desk-architecture in developer mode
Developers can now visualize desk v2 architecture at `/desk-architecture` with layer diagrams and import graphs.
Redesign the editor with Form Builder and field picker
Web Form editor is now redesigned with Form Builder sections and a field picker, replacing the flat grid.
Dock preference
End users can now choose whether the dock is floating or pinned.
Parenthesize subqueries in rendered permission conditions
Permission criterion subqueries are now properly parenthesized, fixing Company Restriction queries on all databases.
Compare is set filters with the column's empty value
`is set` / `is not set` filters now compare with each column type's correct empty value instead of an empty string.
Check the DocType name length when syncing its table
DocType name length is now checked when syncing tables, preventing Postgres truncation on import.
Pdf is blank when the letterhead leaves a tag open
PDFs with unclosed letterhead tags are no longer blank by balancing tags before rendering.
Cut long Postgres index names by bytes
Postgres index names are now truncated at 52 bytes instead of characters, preventing non-ASCII collisions.
Skip virtual fields when saving singles
Single doctypes no longer store virtual fields in `tabSingles`.
Show Link titles for child table columns in Report Builder
Report Builder now shows Link titles for child table columns.
Format sidebar template with $.format instead of __()
Global search sidebar template is now formatted correctly instead of trying to translate it.
Skip SMTP login when authentication is disabled
SMTP login is now skipped when disabled, including for OAuth and basic accounts with saved passwords.
Missing file under /files returns 500 instead of 404
Missing files under `/files/` now return 404 instead of 500.
Contact search link filter, select permission and ranking
Contact search now filters links through Dynamic Link subqueries, respects select permissions, and ranks case-insensitively.
Pick the PDF engine for the doctype's default format
Print, attach_print and multi-document PDF download now use the correct PDF engine for the default format instead of always using the standard one.
Keep button hover off touch screens
Buttons no longer stay grey after tapping by using `@media (hover: hover)` for hover styles.
Align list view toolbar on mobile
Mobile list toolbar ID box and quick filter columns are now properly aligned.
Keep list view columns in place after a refresh
List view columns no longer shift right after reload by aligning header and row widths.
Saving settings fails on a board with no card fields
Kanban settings can now be saved when no card fields are configured.
Web forms ignore link filters on link fields
Web forms now respect link field filters instead of showing the full list.
Prevent currency symbols overlapping grid amounts
Currency symbol overlap in editable table rows is now prevented by sizing padding from the rendered width.
Prevent crash when focusing child table fields on touch
Removed the broken touch-only grid shift that crashed on focus.
Apply field permissions to query aliases and goal aggregates
Field permissions now apply to query aliases and aggregate functions, closing permission bypass paths.
Validate output path before compiling theme css
Validates output paths before compilation to prevent path traversal during theme CSS compilation.
Align child table header with rows
Child table header borders now match row column widths.
Translate untranslated crm user-facing messages
CRM user messages are now wrapped in translation functions.
Keep Data tab header and Save button sticky while scrolling
Data tab header and Save button stay in view while scrolling.
Regenerate the root lockfile for the Playwright swap
LMS CI now passes after Playwright replaced Cypress in package.json.
Preview assessment blocks as summary cards in the lesson editor
Lesson editor now shows lightweight preview cards for quizzes, assignments and exercises instead of full components.
Redesign assessment blocks and render them inline in lessons
Quizzes, assignments and programming exercises are now restyled as cards and render inline in lessons instead of in iframes.
Sanitise JSON-shaped rich text on save
Assignment comments and quiz results are now properly sanitized even when HTML is wrapped in JSON.
Render schedule badges as the true instant
Quiz intro card now shows correct Opens/Closes times for learners in different timezones.
Keep public and private course assets apart on import
Course import now stores assets under separate `assets/files/` and `assets/private/files/` folders matching their URLs.
Migrate Raven conditions stored against the old rule vocabulary
Raven channel mappings created before v2.63 now sync correctly by migrating old rule names to new ones.
Vouch lesson media on the lesson its owner created
Private lesson media remains accessible after an instructor is removed, by validating against the lesson not the instructor's current courses.
Make the user category placeholder read as a prompt
User category select now shows a visible placeholder instead of a greyed "Category" option.
Let evaluators and creators save batch/course meta tags
Evaluators and creators can now save course/batch meta tags (title, keywords) with proper permission checks.
Only attach files the user uploaded for the document
Assignment and job application uploads are now checked to ensure only files the user created are attached.
Lock enrollment course, member and batch after insert
Enrollment core fields are now immutable after insert, preventing students from switching courses/batches via API.
Scope batch authoring and lesson moves to the owning resource
Batch and lesson edits now require ownership role, and live classes enforce batch permission checks.
Require quiz access to check an answer
Unenrolled users can no longer check quiz answers by calling the endpoint directly.
Check progress against the lesson's own course
Progress checks now validate against the lesson's actual course, not the client-provided one, preventing cross-course progress manipulation.
Scope LMS Coupon to the courses and batches it discounts
Coupons are now only editable by instructors of their courses/batches, preventing unauthorized coupon access.
Cap how far an uploaded archive may expand
Prevents ZIP bombs by capping expansion to 1 GB total, 10,000 members max, and 1 MB per member with 100:1 compression limit.
Keep one malformed dynamic route from breaking the others
One malformed dynamic route no longer breaks all other dynamic page routing.
Number copy titles inside the parentheses
Duplicate page titles now number inside the parentheses as `Home (Copy 2)` instead of `Home (Copy) 2`.
Scope block client-script CSS in the canvas like the published page
Builder canvas now properly scopes block client-script CSS, making `:scope` rules work.
Let data.page_data carry dates and decimals
Data scripts can now put record dates and decimals into `data.page_data` without 500 errors.
Render whole-number props without a trailing .0
Builder whole-number props like `29` now stay as `29` instead of rendering as `29.0`.
Give restore jobs the backup timeout of the origin site
Site restore jobs now use the origin site's backup timeout instead of the default 4h, preventing lock timeouts on large restores.
Command palette, keyboard shortcuts, and copy/paste styles
Studio now has a command palette, keyboard shortcuts dialog, and copy/paste style functionality.
Add company-scoped campus support
Campus is now a company-scoped site so multi-location institutions can split rooms, admissions, enrollment and fees while sharing one Company.
Bring back underline
Wiki editor now has underline in the toolbar, bubble menu, and Ctrl+U shortcut.
Internal links between pages
Wiki pages can now link to each other with `[[page-name]]` syntax that survives page moves and route changes.
Open the app on the Overview page
Wiki now opens to the Overview for managers instead of All Spaces; non-managers still see All Spaces.
Remove an incomplete image import before a new import
Incomplete image imports are now removed and reimported instead of causing "has no manifest" errors on every VM start.
Keep TTY console viewers attached across VM restarts
TTY console viewers stay connected across VM stop/restart and show the next boot.
Tuesday, September 29
Show the latest quotation revision as latest
Latest submitted revision of a quotation now shows **Latest** instead of **Open**; a hidden Is Latest Revision flag tracks it.
Consolidated AR/AP summary reports
Summary reports show one row per company per party, followed by that party's total across all selected companies.
Consolidated accounts receivable and payable reports
New multi-company AR/AP reports show outstanding invoices across related companies; rows carry company context and can be grouped.
Group Purchase Order Analysis by item
Purchase Order Analysis now has a **Group by Item** filter that sums qty/amount across orders; total pending is now answerable.
Ship the standard dashboards as Insights dashboards
Accounts, Payments, Selling, Buying, Stock and Asset dashboards are now available as standard Insights workbooks.
Party import tool integrated with data import tool
Customers and Suppliers can now be imported with their Contacts and Addresses from a single file; linked records are created and set as primary.
Remove stale duplicates of five standard records
Print Format POS Invoice, Onboarding Steps and Module Onboarding duplicates are removed; each record has one file.
Post the purchase return after timed receipts
Purchase return test now posts at 12:00 after receipts; test no longer fails when CI runs before 08:00 in site timezone.
Read company when account filters are applied in Invoice Discounting
Invoice Discounting now reads the company from the account filter instead of relying on context; filtering works correctly.
Compare the invoice rate against the receipt's net amount
Invoice-rate landed cost now compares against the receipt's base_net_amount (after discount, before inclusive tax) instead of the rate.
Leave the batch out of the sample limit alert when there is none
Sample retention alert for batched items now names only the item when the batch is missing.
Remove unfilled backdated message placeholder
Backdated stock transaction error now shows the list of authorized users instead of an empty placeholder.
Correct terms and typos in the AU chart of accounts
Australian chart of accounts terms are corrected for accounting clarity.
Avoid too many writes in main item code patch
Material Request Plan Item patch now batches data loads and uses bulk_update; large migrations no longer fail with TooManyWritesError.
Refresh POS item stock qty on new order
POS item stock quantity now refreshes when a new order is created; quantity is no longer stale from the previous order.
Prevent duplicate total rows in trends reports
Trends reports now return `skip_total_row` to prevent Frappe from adding a duplicate total row with doubled values.
Show correct currency for outstanding invoices in bank reconciliation
Outstanding invoices now fetch the transaction currency instead of the company default.
Render bank reconciliation vouchers after dialog opens
DataTable stylesheet is now created only after the Actions dialog is attached; matching vouchers render correctly.
Judge each party account on its own in the invoice limit
Payment Reconciliation prefilter now groups by account; Journal Entry with equal and opposite entries across accounts no longer disappears.
Split Trial Balance (Simple) rows by finance book
Trial Balance now groups by finance book so each row holds one book's entries; no longer sums across books incorrectly.
Sum repeated lines in BOM Stock Analysis qty per unit
BOM Stock Analysis now sums repeated item lines to produce matching Qty Per Unit and Maximum Producible Items columns.
Sum repeated components in Available Stock for Packing Items
Product Bundle qty is now grouped by item before dividing by stock; bundles with repeated items now show correct packable quantity.
Cancel reconciliation entries when recreating stock ledgers
Repost Item Valuation now cancels Stock Reconciliation entries before resubmitting; incomplete ledgers no longer fail.
Apply zero reconciliation to closing balance
Stock Reconciliation that resets qty to zero is now applied in closing balances; zero is no longer treated as missing data.
Ignore incomplete closings for opening balances
Stock Balance and subsequent closings now skip Failed, Queued and In Progress closings and use only completed ones.
Preserve zero batch values in closing balances
Stock Closing keeps zero batch values instead of replacing them with the entire ledger entry.
Refresh landed cost on every receipt of invoiced order lines
Landed cost difference now refreshes on receipts whose billed qty moves but billed amount stays put.
Derive process loss from the finished good rows
Process loss on Manufacture/Repack is now derived from received rows instead of a separate input; loss stays in sync with finished good qty.
Bill purchase orders by qty when landed cost follows invoice rate
Purchase Order over-billing check now compares qty instead of amount, matching the billing behavior of receipts.
Split order-level invoices over receipts for invoice-rate landed cost
Each receipt now prices its rows from the invoiced qty against its own portion, not the entire order quantity.
Bill purchase receipts by qty when landed cost follows invoice rate
Receipt billing now tracks by qty instead of amount; receipts of 100 units billed at 25 units no longer mark as Complete.
Scope reports to the user's permitted companies
Many reports now filter results to the companies the user has access to; bins are scoped to warehouses of permitted companies.
Hide company-restricted masters in reports
18 reports now apply company restrictions to Item, Customer and Supplier masters that are scoped to other companies.
Hide records linked to company-restricted masters
Item Alternative, Party Specific Item and other linked records are now hidden when they reference company-restricted Items, Customers or Suppliers.
Add company permission check for `get_valuation_rate`
Validates that the user can access the company before returning valuation rate.
Data import wizard: Config → Preview → Fix → Import
Data import form is now a 4-step wizard showing clear progress; each step does one thing, and the Import step shows live activity counts.
Skip reports with deleted DocType
Reports on deleted doctypes no longer trigger "DocType not found" error on every desk rebuild.
Open a page route in the shell that lists it
Pages with sub-routes (e.g., Insights at `insights/dashboard`) now open in the correct shell instead of their own module.
Restore the statement timeout after counting dashboard links
Statement execution timeout is now restored after dashboard link count; later ALTER TABLE statements no longer timeout on slow CI runners.
Ignore network errors in Frappe Cloud current_site_info
Network errors fetching trial banner info now return None instead of a 500 error dialog; gunicorn workers can't hang.
Allow ordering by expression aliases on postgres
Postgres grouped queries can now order by arithmetic expression aliases; complex sorting works correctly.
Stop a new comment showing up twice
Activity timeline pending rows are now removed correctly; comments no longer show as duplicates until a hard reload.
Nested __() calls in JavaScript missing from POT file
Translation extraction now finds strings nested inside other __() calls; translators now see `Email Inbox` and other inner strings.
Fix login page tab title translation
Login page tab title is now translated instead of staying in English.
Sync calendar year with date input
Date field calendar now updates when only the year is changed in the input; picker and input stay in sync.
Fall back to docname when title lookup target is unreadable
Link fields no longer show "Not permitted" dialog for every unreadable value; the docname is shown instead.
Support sticky columns in RTL
Grid sticky columns now work correctly in right-to-left layouts.
Multiselect pills adds an unselected option after picking one
Unlabeled multiselect options now fall back to their value; picking a user no longer adds an unselected one.
Keep typed value when Time picker is shown again
Time field picker no longer reverts to the previous value after a manual edit; the refresh now preserves the typed input.
Don't expose imported functions from module-path hooks
Jinja hook functions now only expose what is defined in the hook, not imported modules.
Command palette with search, navigation and actions
CRM now has a Cmd/Ctrl+K command palette for searching leads/deals/contacts, navigating pages, creating records and acting on open pages.
Keep select dropdown below trigger on email template pages
Email template Content Type and For dropdowns now stay below their triggers; list position is stable across selections.
Include helpdesk in docker image
Docker image build now passes apps.json via secret-files and verifies helpdesk is included before pushing.
Pending row avatar and comment delete toast
Pending comment row now shows the current user's avatar before save; delete toast works correctly.
Keep a ticket paused past its deadlines while on hold
SLA status no longer shows Failed when a held ticket is edited; hold time is preserved and deadlines are recalculated correctly.
Date pickers respect the site's configured date format
Date field pickers now show the site's configured date format instead of always showing ISO YYYY-MM-DD.
Bulk insert enrollment shares to stay under the write limit
Share insertion now uses bulk_insert instead of single saves; sites with tens of thousands of enrollments no longer hit TooManyWritesError.
Hold the share_enrollment lock for the patch's transaction
Enrollment share migration now uses a FOR UPDATE row lock; overlapping runs block before reading and see the first run's shares.
Keep SCORM package location off the read every account holds
SCORM launch file and package paths moved to permlevel 1, readable only by System Manager, Course Creator and Moderator.
Scope Course Chapter to the course it belongs to
Course Chapter now follows its parent course's permissions; only instructors and Moderators can edit or delete.
Enforce can_modify_course on generic API doors
LMS Course permissions now apply to read, write, delete and share endpoints, not just 11 dedicated API paths.
Make translation actually callable as `_(...)` in page data scripts
Page data scripts can now call `frappe._()` for translation; attribute access restrictions no longer block it.
Render dotted data keys whose root is missing
Blocks copied to pages with missing root bindings (e.g., `hero.title` on a page with no `hero`) now render safely instead of throwing.
Import each stored table on its own cron schedule
Stored table sync now runs on a per-table schedule instead of all-daily; operational dashboards can refresh hourly.
Scan changed bench scripts with YARA
YARA scanning is now driven by Wazuh file integrity monitoring on changed scripts; threats are logged for inspection.
Add Recent Issues link to Help menu
Help menu now links to known Frappe Cloud issues page; users see known problems before opening a support ticket.
Reject apps without frappe dependency in pyproject
GitHub app validation now rejects pyproject.toml without a frappe key; broken dependency declarations are caught early.
Mark all notifications read for the current team
Mark-all-read now sends the team header; notification state updates correctly.
Close dialog before opening Razorpay checkout
Razorpay checkout dialog now opens cleanly after the payment dialog closes; no modal nesting issues.
Cancel job through endpoint instead of doc method
Cancel Job button now works for dashboard users; the endpoint bypasses doc-level permission checks.
Align STT image Torch dependency
STT image Torch dependency now allows NVIDIA base image; build runs on pull requests.
Match caption fades to meeting surface
Caption fade overlays now use meeting surface token instead of black; pill contrast and layout are preserved.
Restore rounded production captions
Production caption styling restored to rounded appearance.
Add bwh_shipping to the marketplace registry
BWH Shipping (AfterShip and Shiprocket orchestrator) now appears in the marketplace.
Add bwh_payments to the marketplace registry
BWH Payments (Stripe, Razorpay, Tabby, Telr integration) now appears in the Integrations marketplace.
Add Reset SSH Host Keys to Stalwart Node
New Reset SSH Host Keys action clears pinned keys after server reinstall; Provision stays blocked until keys are re-verified.
Reorder blocks directly on the canvas
Studio editor blocks can now be reordered by dragging on the canvas; family components are prevented from leaving their group.
Tighten subject scheduling and restrict faculty to assigned subjects
Subject Schedule now validates that faculty members teach the chosen subject; empty slots, disabled batches and overlaps are caught.
Disable search engine indexing for a page
Pages can now be flagged to send noindex robots meta tag and X-Robots-Tag header; sitemaps and llms.txt still include them.
Measure STT delivery and provision dashboard
STT delivery is now measured and provisioned on a Prometheus/Grafana dashboard; audio seconds and caption counts are exported.
Bias captions for room names and Frappe terminology
Captions now bias Nemotron for room names and Frappe-specific terminology; caption accuracy is improved with curated vocabulary.
Captions with live transcription and speaker attribution
Meet now has opt-in live captions using Nemotron STT with per-participant attribution, bounded VAD, and subscriber-only delivery.
Archive Pulse Event months older than 180 days to Parquet
Old Pulse events are now archived to Parquet files; the 22.5M-row table stays bounded and queries stay fast.
Add a Health dashboard and Pulse sidebar
New Health dashboard answers whether anything is wrong, charting accepted events, rejection rates, latency and app-wide activity against baselines.
Add the unified Suite shell, Home, and Files
First complete slice of the unified Suite frontend with shared shell, Home page and Files section built on the Drive-layer.
Stalwart nodes start without configuration errors
New Stalwart 0.16.20 nodes no longer log configuration errors on startup; spam filter rules are version-pinned.
Stream image transfers without extra disk passes
Image uploads now compress while downloading the next part; downloads write directly to ZFS without temporary files.
Hash snapshot uploads beside compression
Metal now hashes disk snapshots while compressing; the disk is read once and progress starts immediately.
Browser zoom over panels and popovers in editor
Slides editor now cancels modifier-wheel events at the window level; zoom no longer breaks layout over panels and pickers.
Shortcuts firing behind buttons and dropdowns
Keyboard shortcuts now only fire when appropriate (e.g., Enter on a focused button runs the button, not the default action).
Neutral slide outline in navigation panel
Current slide outline is now neutral gray with a gap; focused slides show a darker ring instead of blue.
Extra undo press after some actions that change nothing
Slides editor no longer adds extra history entries for unchanged states; undo skips no-op actions.
Crash on weekly loan disbursement with amortized BPI
Weekly loan disbursement now calculates broken period interest; amortized BPI methods no longer crash.
Update EPF wage ceiling to ₹25,000
PF wage ceiling raised from ₹15,000 to ₹25,000 effective 17 Sept 2026; older slips reprocess unchanged.
Hash whatsapp profile name to avoid collision
WhatsApp profile name is now hashed; multiple accounts no longer collide on the same profile.
Drop frappe from required_apps in tally_migrator
Frappe is now removed from required_apps; app install no longer fails on Pilot.
Sync Student and Guardian Contact Details report
Enrollment report now references Course Enrollment instead of the deleted Program Enrollment; migration updates it.
Trim image caption before serializing to markdown
Image captions are now trimmed before writing to markdown; extra whitespace is removed.
Keep the pivot table reachable on wide screens
Pivot table toolbar menu now stays visible above 1280px; users on wide screens can now discover the feature.
Open someone else's shared draft read-only
Shared drafts now open read-only and never create a fork; draft sync no longer saves a copy on image or code block rewrites.
Saturday, September 26
Revise quotations without cancelling
Submitted Quotations can now create named revisions (like BOM versions) instead of cancel-and-amend.
Create stock entry bundles before updating the work order
Material Transfer for Manufacture didn't mark reserved batches as moved, blocking remaining stock.
Show month names in user language in Customer Acquisition and Loyalty report
Monthly report showed English month names for every user language.
Deadlock when setting item default income account
Concurrent Sales Invoices deadlocked updating Item Defaults when rows were in different order.
Keep customer shipping address on drop ship purchase order
Company trigger replaced customer shipping address on drop ship POs when duplicating or changing company.
Count only matched batches on work order reservations
Batch-wise Work Order reservations blocked unrelated batches after moving a different batch.
Proforma Invoice fixes
Proformas could be amended and recreated; descriptions lost between orders.
Validate Proforma Invoice lines in the controller
Proforma Invoices created via REST API skipped validation, allowing cancelled orders and mismatched amounts.
Refresh planned qty after work order status update
Manufacture entries with process loss left stale planned_qty in Bins.
Release the work order reservation before previewing a stock entry
Stock Ledger and Accounting previews failed for Work Orders with Reserve Stock enabled.
Use Text Editor for manufacturing descriptions copied from items
Work Order descriptions copied as-is from Text Editor but stored in Text fields, printing with literal tags.
Scope secondary items to job card
Split Job Cards lost scrap rows when both used the same secondary item.
Use Text Editor for fields that store HTML
Delivery address and Asset fields stored HTML but were plain Text, printing with literal tags once frappe escapes them.
Filter purchase register by supplier group from supplier master
Purchase Register dropped older invoices when filtered by Supplier Group (unfilled fetch_from field).
Replace removed validate_import_file call in Bank Statement Import
Saving Bank Statement Import threw AttributeError after Frappe's Data Import refactor.
Offset plan reservations across warehouses
Production Plan reservations didn't track when Work Orders used different warehouses, overstating reserved stock.
Explode phantom BOM rows by their stock qty
Phantom sub-BOM rows exploded using display qty instead of stock qty, inflating component requests 1000x for unit conversions.
Show only company bank accounts in Bank Statement Import
Show only company bank accounts in Bank Statement Import
Keep a closed production plan closed until it is reopened
Auto status updates on a Production Plan silently reopened manually Closed plans.
Release plan reservations when the plan completes
Production Plans didn't recalculate reserved stock when completing, leaving stale reservations.
Per-field date format for Date and Datetime fields
Date and Datetime fields in print formats now support per-field date format via inspector with live preview.
Paint a returning record from the shared cache
Record pages now paint instantly on return visits from the shared in-memory cache before a quiet background refresh.
Adding right align support in embedded list column
Adding right align support in embedded list column
Skip stale Custom DocPerm entries in File permission query
Skip stale Custom DocPerm entries in File permission query
Follow-ups from end-to-end testing of the print format builder
Classic format conversion lost section headings, margins, fonts; Chrome PDFs skipped pages; print previews misdated.
Disable automation queue toast
Background Task toasts appeared for silent automation runs.
Do not write unset settings back on settings dialog
Do not write unset settings back on settings dialog
Drop :where() from the standard cell rule for wkhtmltopdf
wkhtmltopdf's WebKit dropped the entire table cell rule, losing padding and alignment in PDFs.
Start the preview overlay at the page head's real bottom edge
Print format preview started below the page head; backdrop also failed to paint due to Chromium rendering issue.
Don't show an error for a deleted Number Card
Missing Number Card on a dashboard left an error message even though the card was handled gracefully.
Child table row closes after uploading or clearing a file
Uploading/clearing files in Attach fields collapsed open rows, forcing reopens for multi-field edits.
Five open print issues
Print Settings font size was overridden by Redesign style, default layout ignored Tab Break.
E2E findings on the new builder renderers
Email attachments carried wrong letterheads, classic format migration lost settings, Typst renderers had incomplete coverage.
Use frappe.log_error instead of frappe.error_log
Company creation failed silently when a salary component insert failed due to invalid frappe.error_log call.
Allocate leaves left in annual quota instead of skipping allocation
Earned leave rounding inflated monthly allocations beyond the annual policy, causing scheduler failures.
Open the welcome ticket after skipping the questionnaire
Skipping onboarding landed admins on Home instead of the seeded welcome ticket.
Reload preview when the page is saved elsewhere
Builder preview reloads when saved in another tab.
Show the open folder's pages above the layers tree
Builder now shows pages from the current folder at the top of Layers, one-click switching between related pages.
Add gap handlers for flex and grid containers
Flex and grid containers now have draggable on-canvas gap handles, like padding already did.
Create duplicate pages as numbered drafts and add rename to page actions
Duplicating a page kept the original title; copies inherited publish state.
Hide the pages list scrollbar and skip redundant list loads
Pages list scrollbar appeared unnecessarily; page switch triggered duplicate list loads.
Add static pool dialog for Generic provider
Generic provider operators can now add static IP pools from a short dialog.
Add Visit site and Open server to site server actions
Site server actions menu now shows both "Visit site" and "Open server".
Register a region's Cargo automatically once it answers
Central automatically registers Cargo after it answers health checks; no manual URL entry needed.
Apply the datum credential from bootstrap metadata
Pilot parses and applies Datum telemetry config from bootstrap metadata.
Pass the datum credential to a new pilot
New Pilot servers receive Datum endpoint and token in bootstrap metadata for telemetry.
Build host binaries and images in Docker on macOS
macOS developers can now build Atlas binaries and Ubuntu images in Docker without Linux headers.
Pass the Datum host config to Cargo
Cargo now accepts Datum Host config during provisioning via the dialog.
Advance slides on their own and present on loop
Slideshows can now auto-advance after a delay per slide for unattended booth displays.
Bound guest metadata to a 256 KiB MMDS cap
VM metadata now validated against Firecracker's 256 KiB MMDS limit to prevent guest hangs.
Fit small diagrams on desktop
Small flow diagrams scrolled horizontally despite fitting in the reading column.
Bound the NDP payload length for the verifier
Kernel BPF verifier rejected WG Mesh uplink program.
List disabled authors in the author filter
Search author filter listed only enabled users, blocking filters by posts of disabled accounts.
A cell fill keeps the grid lines around it
Cells with background colour erased top and left grid lines.
Use frappe-ui ScrollArea for native scrollbars in dark mode
Dark mode showed light browser scrollbars on emoji picker and dialogs.
Send Pilot storage and telemetry as their own guest metadata values
Every Pilot server create failed when metal-central metadata exceeded 1024-byte limit.
Read storage and telemetry from their own instance metadata attributes
Pilot read storage from bloated pilot-central, exceeding cloud's 1 KiB metadata limit.
Read the dispatch time in the system time zone
Server creation marked as "not created" due to timezone mismatch in recovery search.
Pass the document to controller method calls
Eight desk buttons failed with "Failed to get method" (Test Connection, Enroll Atlas, etc.) because `frm.call` didn't specify the document.
Prepare host storage and retire unused warm images
Metal setup could write state before ZFS dataset mounted; warm image retirement didn't account for in-use disks.
Sweep only images with a site file retention time
Expired site file sweep saved every Object Storage image every 15 minutes, polluting audit logs.
Reclaim retired image artifacts after six hours
Replacing System images left old artifacts in storage indefinitely.
Wake a sleeping VM on start
Start request did nothing for sleeping VMs; only new traffic woke them.
Boot Ubuntu 22.04 images with the 24.04 kernel
Ubuntu 22.04 guests failed to boot with kernel panic on missing root device.
Friday, September 25
Serial and batch wise stock balance report
Serial and Batch Wise Stock Balance report lists batch nos and serial nos per item with opening, in, out and balance qty/value.
Use template BOM for variant finished goods
Variant finished goods without their own BOM now fall back to the template's default BOM in subcontracting.
Subcontracting inward reports
Three reports for Subcontracting Inward Orders: summary, raw materials to be received, finished goods to be delivered.
Show invoice/payment/difference totals
Payment Reconciliation now shows totals for invoice amount, payment amount and difference; updates live as rows are checked.
Use per-unit BOM qty for process loss receipt
Process loss receipt multiplied lost qty by BOM's `stock_qty` (qty for whole BOM), not per-unit qty; now uses `qty_consumed_per_unit`.
Drop unused serial balance from Stock Ledger
Stock User without Serial/Batch Bundle write got PermissionError on Stock Ledger report when ledger rows stored serial nos as text; removed unused code.
Resolve scorecard variable paths in modules not yet imported
`import_string_path` failed for paths into a submodule not yet imported; now imports the longest dotted prefix that is a module and resolves the rest as attributes.
Respect permissions on sales and purchase invoice actions
Sales and Purchase Invoice Create dropdown showed actions without checking permission to create the target document.
Skip activities fetch on unsaved CRM doc
Opening an unsaved CRM document fetched activities with no reference doc, so it threw.
Convert service cost to company currency
Subcontracting Order service items were mapped straight from a foreign-currency Purchase Order with no conversion, adding supplier currency to company currency.
Set correct transaction type on args copy while evaluating item wise pricing rule
Pricing rule evaluation on an args copy left the copied transaction type empty, so rules scoped to transaction type never matched.
Restrict delivery to reserved serial nos when ensure delivery by serial no is set
Delivery Note and Sales Invoice with Update Stock could deliver any serial no even when the Sales Order Item required specific reserved serial nos.
App-built page islands and sidebar item routes
`assets.json` is now the island registry; apps declare page islands built as entry assets, islands kept if app is installed.
Allowlisted pilot passthrough
`pilot_request` allowlisted pass-through to pilot for Cloud Settings features like backups.
Open every record on Details, and draw skeletons while content loads
Record page opens on Details for every doctype; desk v2 draws skeletons instead of spinners while regions load.
Refetch meta, form layouts and list settings after a DocType change
Desk v2 now listens for `doctype_update` and drops memos for that DocType, so Customize Form changes take effect immediately.
Second addresses for the standard list and record page
New addresses `/:doctype/view/list` and `/:doctype/view/record` for standard pages; saved views moved under list kind.
Find and resolve replacement page declarations
Build finds pages that replace a DocType's record or list page and resolves which one wins.
Shared data cache for records and lists, fed by the API wrapper
In-memory data cache added for records and lists in @framework/ui; API v2 wrapper feeds it from every response.
Open a DocType's declared replacement page at its main address
A DocType can replace its record or list page with an app's own page; main address opens the declared replacement, standard page at second address.
Let users choose the import type
Import type selector added to New Data Import dialog; Update Existing and Insert or Update are now reachable from UI.
The page name-clash check in the router, the build and the server
One URL segment after an app prefix can belong to a page, DocType or module; name clashes now checked, DocType/module always kept.
Record page paints once
Record page paints once by fetching scripts early and drawing them once per handler; slow scripts have a 500ms timeout.
Feat!: backport new print format builder
New print format builder with Classic builder option; WeasyPrint becomes explicit deprecated renderer.
Hide db-column-only field properties for no-value fieldtypes
Index, Unique and Not Nullable checkboxes showed for Table, Section Break, HTML, Button fields; now hidden.
Keep the builder away from file-backed standard formats
Standard formats whose HTML ships as a file had the Edit Format button even though the builder cannot edit them.
Remove orphaned navbar search
`/search` route was removed but navbar form still submitted to it; removed the orphaned form.
Sorting by the status column after resizing it throws
Sorting list view by a resized status column threw because column width changes broke the sort index.
Duplicate doctypes in the user permission applicable for list
Applicable for list repeated a child doctype per parent or table reaching it; now drops duplicates and fixed pagination slicing.
Sort Link columns by their title
Link columns for doctypes with "Show Title in Link Fields" displayed title but sorted by name; now passes sortValue hook for title-based sorting.
Show formats created before print_format_for existed
Old print formats with NULL print_format_for were hidden from the picker; now treats NULL as DocType.
Bring version-16-polished CI back to green
Kanban endpoints, duration picker, saved layout restoration and Cypress helper fixes.
Stop the import-list search box from collapsing
Status select on the import list stretched to form height; now wrapped in fixed-width container.
Preventing meta dependency in the check_if_large_table
Large table check triggered Meta recursion; resolved by preventing Meta dependency.
Datetime direct usage to prevent Meta dependency
`add_to_date` led to recursive `Meta(__doc__)` calls during `Meta.__init__`; now uses datetime directly.
Read the letter head zone source from what it renders
Letter head HTML zone showed **Image** in the builder even with HTML content; now treats a zone with content but no image as HTML.
Keep h3 and h4 bold in print view and pdf
Headings lost bold in print after the global `h3, h4 { font-weight: bold }` rule was dropped; now added to print.bundle.scss only.
Keep no-value fields out of the default layout
Fresh default layout picked up every labelled field including no-value fields like Tab Breaks; now skips them in both JS and Python.
Do not lose edits when an autosave fails
Failed autosave was silent; page left after a failure silently discarded edits; now reports the failure, re-arms autosave on the next edit, and flushes before leaving.
Errors and cron check-ins from jobs never reach sentry
rq ends work horses with `os._exit`, which skips Sentry SDK's atexit flush; anything in the transport queue is dropped; now calls `sentry_sdk.flush()` before teardown.
Oauth discovery advertises http urls behind an https proxy
`/.well-known/openid-configuration` advertised http URLs behind an SSL-terminating proxy; now respects `host_name` in site_config.json.
Parse numbers using the user's number format
Importing CSV with decimal-comma numbers (e.g., 19,18) silently corrupted them by stripping the comma, saving 1918.0; now explicitly parses using the user's active NumberFormat.
Close the Typst and page-break gaps against Chrome
Typst-rendered formats had newlines after `
`, missing list markers, wrong default font, and collapsed aligned sections; now match Chrome and HTML preview.
Setting the deprecated role profile field applies no roles
A user created with only `role_profile_name` set got no roles because the field was cleared before it moved into `role_profiles`; the move now only happens when the caller changed it.
Direct links are dropped when a child table links the same doctype
`get_linked_fields` dropped direct links when the same doctype also linked through a child table, so linked documents through the header went missing.
Open CRM Lead and CRM Deal on Activity
CRM Lead and CRM Deal now open on Activity first; desk v2 finds record scripts at `/doctype//frontend/record.js`.
Add tooltip to side panel edit layout button
Edit layout pencil in the side panel had no tooltip while others showed "Edit Fields Layout".
Complete web link attachment upload and surface its errors
Web link attachment upload left the dialog open, failed silently, and never reset loading state.
Add auto-create for Link fields in SidePanelLayout
Link fields in the side panel lacked auto-create; now opens CreateDocumentModal and writes the new doc back.
Quick filter input reset
Self-triggered view reload made the quick filter input reset stale; now counts pending reloads and skips the reload.
Prevent quick filter select dropdown from clipping options
Quick filter select dropdown options were clipped by a parent overflow.
Reply from the user's own email account
Replying to an email set From to the sender; now uses the user's own email account if it appears on the email.
Play call recordings stored as site files
Call Details player used a recording proxy that only fetches http(s) links, rejecting file paths; now loads file paths directly.
Guard primary contact before reading its mobile number
Calling a deal with no primary contact threw TypeError instead of showing the "No Primary Contact Set" toast.
Label the components panel
Components tab now opens with **Components** heading like other panel sections.
Keep canvas zoom and pan when switching pages
Switching pages in editor keeps zoom and pan; opening a page still fits it; shorter page scrolls to top at same zoom.
Set the route variable example in monospace
Route hint `/users/:id` now renders as code.
Tighter social preview card in page meta settings
Social preview card stretched to form height; now sizes to content with proper link preview layout.
Add process snapshot script
`press/scripts/ps_snapshot.sh` saves a timestamped snapshot of all processes with user, PID, CPU, memory, state and command line.
Exempt teams from 7 day wait for SSH access if they have a subscription or have paid an invoice
Teams with subscriptions or paid invoices bypass SSH access wait period.
Open the full plan list on unified Hetzner servers
CPU and Memory only resize checkbox started checked, hiding full plan list; now starts unchecked.
Try connecting to agent a couple of times when trying to poll jobs
Server resize retries agent connection on transient failures.
Hide the plan change notice when the plan never changed
Change-plan dialog showed "Plan last changed on..." for sites that never changed their plan; now hides the line for Initial Plan entries with no from_plan.
Wait until the site answers before login redirect
After signup, the proxy sometimes redirected to the dashboard before its upstream was loaded; now waits until the site answers a request.
Rename side to edge with start/end values
Tabs `side` renamed to `edge` with start/end values matching text direction; line and selected tab styling updated.
KeyboardShortcut draws + only between text keys; LoadingIndicator is now Spinner
KeyboardShortcut writes shortcuts naturally ("⌘K" not "⌘+K"), LoadingIndicator made same component as Spinner; auto plus rule for cross-platform readability.
App-shell layout, one structure for component pages, rewritten migration guide and changelog
Docs site now has app-like layout, one page structure for every component, plain-English migration guide and changelog fact-checked against originals.
Rewrite for the 1.0 release
README rewritten to show current shape of package, skipping 2022 origin story and adding everything 1.0 brings.
Run transform once, and keep each user's cache apart
Cached list with transform no longer crashes on second open; each signed-in user gets their own cache with no setup.
Don't clone full repo for pinned full sha
Pinned full SHA no longer clones the full repo.
Route automatic IPv6 on AWS and Scaleway
Atlas setup now enables Route Automatic IPv6 for AWS and Scaleway.
Add IPv6 routers, public IP pools, and VM routes
VMs can get public IPv6 through an IPv6 router or direct `/128`; Public IP Pool replaces Metal Server IP Address; one route list replaces egress mode.
Ubuntu and ssh flow
Team SSH key management and per-server key selection for Ubuntu VMs; public IPv4 with SSH-only inbound access; clear connection instructions.
Add dashboard facing APIs for Object storage
Bucket management routes for the dashboard: list, create, rotate, cap and delete buckets with tenant/region prefix.
Enforce server-scoped role grants
Role granted on one server now applies only to that server; team-wide grants and server-scoped grants both supported.
Public ipv6, firewall, and web console
Servers can request public IPv6 address and Atlas firewall; web console opened from dashboard; server overview shows public addresses and SSH command.
Search events from the command palette
Calendar search now finds events from shared calendars and shows results on a phone search page; searches and ranks improved.
Billing sidebar and snapshot
Billing sidebar collapse, badge display and snapshot UI fixes.
Skip evaluating `_strip_eval` on empty expression for `_or_whatsapp` and `_and_not_whatsapp`
Installation evaluation on empty expressions threw.
Validator use bench python environment for app syntax validation
App validation now uses bench's Python environment instead of Pilot's, so modern syntax on newer Python versions passes.
Refuse a non-empty bucket delete as invalid input
Non-empty bucket delete now shows "Bucket still holds objects" instead of "Could not confirm".
Serve the VM console page to every user
Console link returned 403 for users without a Frappe session; now serves `/vm_console` to every user, token validates access.
Harden the tenant networking API
Network changes on one VM run serially; API returns clear conflict messages; IPv6-only VMs can now resolve names.
Fix IPv6 router setup, catalog sync, and node console
Router creation, Scaleway catalog sync and node console access restored.
Remount the guest root read-only on errors
Guest with ext4 errors kept writing to damaged disk; base images now set ext4 error behavior to remount-ro.
Warm-start only a new VM disk
Warm image memory is valid only with the image disk it was captured with; now resumes only on first boot.
Keep custom app builds working with the v1 code field
App builder build failed with codemirror/lezer conflicts; skips pages with no blocks.
A collapsed row keeps its height when the cursor arrives
Collapsed mail rows rose ~2px under the cursor when the preview was empty; now states the same 20px height on the name.
Show the caret when clicking below the compose body
Clicking below the compose body gave focus with no caret because an empty non-editable node at the end became the default block.
The attachment viewer keeps clear of the iOS safe areas
Attachment viewer teleported to body had no safe-area insets, so buttons went under the status bar and home indicator.
Keep image caption styled when soft breaks render as
Image captions lost their italic style because soft breaks between image and caption rendered as `
`, breaking the CSS selector.
Update discussion title optimistically
Renaming a discussion showed the new title only after the server answered; now shows it at once.
Open a page again after returning to the pages list
Opening a page again after returning to the Pages tab showed the URL change but the Pages list stayed on screen; Teleport target was missing.
Drop foreign sources without a gateway return route
IPv6 router translated every public address in its block to mesh; WG Mesh now delivers foreign-source packets only when the VM has a gateway route back.
Screen ham with a positive spam score
Stalwart v0.16.19+ hands Sieve a graded spamtest value instead of 1 or 10; mail with a small positive score (≥0.1) skipped screening and was delivered to the Inbox.
Permission-check logs, sends without a reference, and account sync endpoints
Whitelisted endpoints for logs, sends and syncs required no permission check, so any logged-in user could read business logs, send from the business number, or trigger a sync; now each requires matching DocType permission.
Thursday, September 24
Handle missing and item group default supplier in MRP make_order
fix: handle missing and item group default supplier in MRP make_order
Skip ERPNext persona for HRMS signups
fix: Skip ERPNext persona for HRMS signups
GL-only reposting from Stock and Account Value Comparison report
A **Create GL Reposting Entries** button queues `Repost Item Valuation` with `repost_only_accounting_ledgers` set, rebuilding the ledgers without touching valuations.
Make bank reconciliation dialog voucher types extensible
The Bank Reconciliation Tool dialog now uses a registry so apps can add their own bank-affecting vouchers like Loan Repayments.
Close individual blanket order items
Blanket Order rows now have Close Items and Reopen Items actions, letting rows stay closed while unordered qty remains.
Close and re-open blanket orders
Blanket Orders now have a status (Draft, Submitted, Closed, Cancelled) and Close/Re-open actions; closed orders hide Create buttons and drop out of pickers.
Email templates for customer-facing emails
Proforma Invoices and POS receipts can now use Email Templates for subject and body, with templates receiving the document as context.
Add permission checks for serial/batch creation using scanning
Serial/Batch creation via scanning now validates user permissions.
Negative stock value for moving average items with mixed batchwise valuation
Forward port of two hotfix PRs fixing Moving Average items whose batches mix batchwise and non-batchwise valuation.
Report uae vat 201 sales vat in company currency
UAE VAT 201 now reports foreign-currency Sales Invoice VAT in the company currency, matching the Sales Register.
Count complete opening depreciation periods accurately
Fixed straight-line depreciation to preserve month-end boundaries and count whole periods correctly.
Put a customer on hold
Customers can now be put on hold with a release date, blocking Sales Orders, Delivery Notes, Sales Invoices and POS Invoices until release, mirroring the Supplier hold feature.
Stop ordering against an expired blanket order
All Create buttons (Purchase Order, Sales Order, Quotation) and the item details picker now block expired Blanket Orders consistently.
Throw clear message when MRP purchase item has no default supplier
Material Requirements Planning now throws "Default Supplier for {items} not found" before attempting to create a supplier-less PO.
Translate doctype name values in report columns
36 report columns holding DocType names now render translations on screen and in print.
Keep against voucher link in general ledger for non-english users
General Ledger's Against Voucher Dynamic Link now renders as a link for non-English users instead of plain text.
Block Quality Inspection submit without a sample size
Quality Inspection now requires Sample Size > 0 at submit (drafts still save with 0), preventing zero-sample inspections.
Round running allocation balance in payment reconciliation
Payment reconciliation now rounds the running FIFO allocation balance to currency precision, fixing "allocated amount greater than unadjusted" failures.
Use preferred addresses in customer quotations
Creating a quotation from a customer now uses the preferred billing and shipping addresses instead of the latest linked ones.
Reset stale selected mode of payment on new invoice
Intermittent POS invoices with `paid_amount = 0` and status Unpaid are now fixed by resetting stale Mode of Payment selections between invoices in a session.
Quote the reversed row's rate on a consolidated credit note
POS Closing Entry consolidation now correctly applies invoice-level discounts to reversed rows, fixing rate validation failures.
Subtract consumption entries from available materials
Return Components and backflush now correctly account for consumed materials, preventing proposals to return already-consumed material.
Finish a work order after partial material consumption
Work orders can now complete after partial Material Consumption entries when "Get Raw Materials Cost from Consumption Entry" is enabled, by excluding consumed materials from the Manufacture entry.
Continuous raw material consumption with bom validation
Manufacturing now compares the BOM against consumption entries when "Validate Components and Quantities Per BOM" is on, fixing validation failures on partial material consumption.
Add permission checks to whitelisted methods and the DocPerm rows they need
Backports the same permission hardening to v16-hotfix, affecting stock, accounting, and CRM workflows.
Add permission checks to whitelisted methods and the DocPerm rows they need
Backports six permission-checking fixes to v15-hotfix. Whitelisted methods on several doctypes now validate user rights before executing, preventing unauthorized access to doctypes like Material Request, Stock Entry, and others.
Attribute document events to the doctype's app
fix(telemetry): attribute document events to the doctype's app
Drop the field template section from the print format builder library
feat: drop the field template section from the print format builder library
Update IntermediateStepModal to new Dialog API
fix(ui): update IntermediateStepModal to new Dialog API
Drop Beta from the print format builder field label
fix(print): drop Beta from the print format builder field label
Hide the print format builder flag
fix(print): hide the print format builder flag
Print format builder folds the sidebar instead of hiding it
The print format builder now folds the sidebar to its icon rail instead of hiding it, keeping navigation available.
Let a Filter host choose its fields and popover alignment
`Filter` components now let the host pick fields and declare custom ones, and choose popover alignment.
Catch up on writes made while a build ran
Search index builds now catch up on writes made during the build, preventing stale text in results.
Add frappe.ui.form.set_controller
`frappe.ui.form.set_controller(doctype, ControllerClass)` now registers class-based form controllers without needing to extend `cscript`.
Pass the form to link query functions
Link and Autocomplete controls now pass the form as a fourth argument to query functions, letting them act on the form without reaching for `cur_frm`.
Support using an Email Template for content
Notifications can now link an Email Template for dynamic subject and message content instead of inline text.
Draw the record tab strip on the generated page
The generated record page now draws its own tab strip; Client Scripts can switch to named tabs, and the reader's tab lives in the address.
The activity feed on the generated record page
The generated record page now draws real Activity, Emails and Files tabs with live content; Client Scripts can read and extend the feed.
The composer band and the comment writer on the record page
A composer band at the bottom of Activity and Emails tabs lets readers write comments; a `page.composer` list lets Client Scripts open it by name.
Edge case in the new routing
Fixed an edge case in the new routing where Audit trail in India Compliance was causing issues.
Stop two test state leaks that fail unrelated v16 tests
Two tests that leaked state into later shards are now fixed.
Menu stays open after navigating back
Dropdowns now close when `frappe.router` fires `change`, preventing menus from floating over the new page after a back-button navigation.
Mark notification as read when clicked
Clicking an unread notification now marks it read, clears its dot and lowers the badge count.
Render relative links to avoid storing hardcoded absolute url
Relative links are now rendered instead of storing hardcoded absolute URLs.
Skip invalid GitHub release tags
`check_for_update` no longer fails on non-semver release tags and now strips leading `v` before parsing.
Accept a dict as the on_parent target
`get_mapped_doc` now handles dict `target_doc` in the `on_parent` branch, fixing mapping into child rows of dict parents.
Email writer in the record composer
A built-in email writer on `page.composer` lets readers send emails directly from the record page; sent emails appear in the feed at once.
Float the record composer in the shell
The record page composer now floats in a window, staying visible as the reader navigates to other pages.
Add perm. conditions in perm. hooks
Permission hooks now include comprehensive permission checks, preventing unauthorized report access.
Generate print_by_server temp file path server-side
Temp file paths for server-side printing are now generated server-side instead of accepting arbitrary `file_path` input.
Stop password reset flow from bypassing 2FA
Password reset now respects 2FA settings, closing a hardening gap in the login flow.
Narrow write on a program to the people named on it
fix(perms): narrow write on a program to the people named on it
Lowercase 'content' in course content empty state
fix: lowercase 'content' in course content empty state
Restore dashboard sidebar header menu
The Builder dropdown in the sidebar now shows options after the frappe-ui 1.0.0-beta.76 upgrade.
Let the editor demo open when the canvas is ready first
The editor demo now opens reliably when the canvas is ready before the page finishes loading.
Load real italic faces in the editor and at inherited weights
Italic text now loads real italic faces at inherited weights instead of browser-slanted romans.
Stop dark-mode image sources adding an extra layout gap
Dark-mode images no longer add an extra gap by hiding `
List workbooks and dashboards by access, with quick filters
Lists now show owned and shared workbooks and dashboards with quick filters by title, data source, and other fields.
Map and number card regressions from the frappe-ui upgrade
Maps without data and Number cards now render correctly after frappe-ui chart token and type-scale changes.
Hide the take backup button on archived sites
fix(dashboard): Hide the take backup button on archived sites
Don't restart benches when Increase Disk Size resizes nothing
Disk resize jobs no longer restart benches when no resize actually happens, preventing unnecessary container recreation during prolonged disk-full alerts.
Allow bool in the stored value type selects
Press Workflow tasks that return booleans no longer fail on save.
Skip trial requests without a site in subscription job
The subscription job now skips trial requests with no site, preventing `AttributeError` on missing `creation`.
Wait for proxy upstream before marking site created
Standby trials no longer get marked "Site Created" before the proxy's upstream job finishes, preventing early `site_not_found` redirects.
Skip Bahrain and UAE in orphan cleanup
Unreachable Bahrain and UAE clusters are now excluded from orphan snapshot deletion.
Skip in-use snapshots in orphan cleanup
Orphan snapshot cleanup now correctly skips snapshots linked to live Server Snapshots.
Cycle chart colours when series outnumber them
The Disk I/O chart no longer crashes on hover when series outnumber theme colours.
Create bench env before get-app validation
fix(validation): Create bench env before get-app validation
Grow disk on resize and adopt the unified Atlas resize API
feat(servers): grow disk on resize and adopt the unified Atlas resize API
Remove routes on terminate and close resize gaps
fix(servers): remove routes on terminate and close resize gaps
Pin the sidebar collapse knob at the middle of its edge
fix(ui): pin the sidebar collapse knob at the middle of its edge
Tidy the server overview snapshots card
fix: tidy the server overview snapshots card
Recompute sticky column offsets on column resize
Pinned columns stay aligned after resize drag and double-click auto-fit.
Add frappe_microsoft365
Microsoft 365 integration for Frappe and ERPNext with two-way Outlook calendar sync, Teams meeting creation, and sign-in with Microsoft.
Add buzz to the registry
Buzz, an open-source event management app, is now in the app registry.
Bucket via doctype model
Adds a Bucket doctype and removes the custom arbiter model in favor of garage arbiter.
Use NDP discovery and add support for VM gateways
WG Mesh now uses NDP for discovery, supports tenant-0 VMs as network gateways, and public IPv6 blocks without per-VM public addresses.
Show missing fields and allow removing them
The data source editor now detects and displays fields configured but missing from the schema, so they can be removed.
Add RBI Key Facts Statement (KFS)
The loan flow now includes a Key Facts Statement as required by the RBI, showing amount, interest rate, tenure, instalment and repayment schedule.
Create Loan Repayment from Bank Reconciliation Tool
Loan Repayments can now be created directly from the Bank Reconciliation Tool, the same way Payment Entries and Journal Entries are.
Take, bill, keep and restore VM snapshots
Customers can take, keep, delete and restore server snapshots; Central owns each snapshot's record, price and deletion.
Give app publishers read access to their events
App publishers now get read-only database access to the Pulse Event view, filtered to their apps.
Delete a space from space settings
Spaces can now be deleted from Space Settings, with a confirmation dialog listing what will be deleted.
Add create-frappe-ui, to start a frappe-ui app in one command
`npm create frappe-ui@latest` now starts a frappe-ui app with one command, automating the dozen manual setup steps.
Mobile settings
Settings on phones now display without squeezing, using the More menu for tabs and full-width panels.
Fix/unicommerce old order returns sync
Old Unicommerce orders now get RTO credit notes by fetching the facility code from each package's Sales Invoice.
Print format fixed
Printing a discussion now produces a usable document without sidebar and with all comments visible.
Fix search focus
Search now accepts Enter and Backspace without being manually focused.
Join active line highlight to gutter
The active-line highlight now extends to the line-number gutter while text keeps its inset.
Capture review comment ID reliably
Barista review comment tracking is now reliable by reading marker files instead of trusting state.
Search mail from the command palette
Mail search moves from a separate modal into the command palette behind a filters button, unifying mail search with the rest of the app.
Measure a message body with a box, not without one
Message bodies now measure with a visible box, fixing cases where the iframe resizer reported 1px height on empty bodies.
A lone draft fills the reading pane, and reply drafts stop hovering grey
A draft opened from Drafts now stretches to the pane, and reply drafts under other mail no longer pick up hover styling.
Collapse quote trails from every client, and keep quotes intact through the composer
Mail now collapses quoted content from Gmail, Suite, Yahoo, Proton, Zoho, Outlook Web, and Apple Mail/Thunderbird, and preserves quotes through the composer.
A filled cell takes its ink from the fill, not the theme
Color-scale rules in dark mode now use the cell's effective fill for text color, making values readable.
Enter opens the selected cell for editing
Pressing Enter on a selected cell now opens it for editing instead of moving the selection down.
Remove issue triage
Barista's issue triage workflow is removed; fix and review modes stay, now reading the issue directly instead of triage comments.
Monday, September 21
Validate warehouse account belongs to selected company
Prevents warehouse creation with an account belonging to a different company by validating account company on warehouse change.
Split view in report view
Adds split-view option in report view to display linked documents side-by-side, enabled via user settings.
Collaboration writes go to /api/v2 document sub-resources
Routes assign, share, tag, favourite, follow, and comment operations through /api/v2 sub-resources instead of legacy endpoints.
Restore blue selection ring and marquee
Restores blue selection styling after accidental gray override.
Doctype field editor labels the standard filter option differently
Renames `in_standard_filter` label from "In List Filter" to "In Standard Filter" to match other UI surfaces.
Canvas renders author html and zones the way the print does
Brings HTML block canvas rendering and print rendering into agreement by applying the same sanitization rules to both surfaces.
Harden runtime and run pull request CI
Enforces safe transaction boundaries for SQLite, retries background jobs, hardens document locking and setup callbacks, and adds SQLite to pull request CI.
Add optimistic reply and comment in the timeline
Wires composer emit, sends comments optimistically through the timeline, and ensures socket-less replies still appear without refresh.
Make the draft status dot hollow
Makes draft status dot hollow to match the "filled means live, hollow means not live" rule across all page statuses.
Review a large change by question, in stages
Splits large code reviews into multi-stage runs: plan step, per-question readers up to ~25 files, merge step to apply findings.
Manual override for build memory cap via bench.toml
Adds `[build] memory_limit_mb` setting in bench.toml to override auto-sized build memory cap.
Move the user switcher into the account menu and the You page
Removes floating dev user switcher and integrates it into the account menu on desktop and Developer group on the You page mobile.
Feat(typography)!: text-* line height is 1.35, leading-tighter keeps 1.15
Changes default text line height from 1.15 to 1.35 for better readability on wrapped text, adds leading-tighter class for single-line text.
Feat(Sidebar)!: settle five sidebar family behaviours before 1.0
Settles SidebarItem icon behavior, attribute split, nav landmark, and other family-wide inconsistencies with breaking changes before 1.0 release.
Delete identities from settings
Adds Delete button in Mail Settings > Identity with confirmation, using server-reported deletability and bulk_delete backend.
DMARC reports are copied from the clusters and served to sites
Copies DMARC aggregate reports from cluster receivers hourly into `DMARC Report` documents and retains them per site settings.
A DMARC Reports page in the Mail Admin Dashboard
Displays DMARC aggregate reports with pass-rate tiles, sending sources, reporters, and per-source verification records grouped by domain and period.
Page view analytics
Adds Web Page View logging for published wiki pages, Overview page with views, visitors, and top content metrics, and per-space/per-page analytics in settings.
Use wiki logo as /wiki-app favicon
Replaces Frappe favicon with Wiki logo and removes stray favicon from highlight build output.
Add Overview tab to the bottom nav
Adds Overview tab to mobile bottom nav for Wiki Managers and keeps Change Requests active on the review route.
Bullet and numbered list fixes
Fixes bullet and number markers drifting from text on mixed font sizes, running into numbers in aligned lists, and improper spacing.
Hide the bottom nav on discussion and editor pages, float the comment button
Hides mobile bottom nav on discussion and editor routes, floats the comment button with proper clearance above the nav in PWAs.
Resize body cells while dragging a column
Applies column width updates and body style changes on every mouse move during resize, preventing header-column misalignment during drag.
Scope the task list to spaces the user can see
Restricts task list queries to only spaces the user can access, preventing users from reading tasks in private spaces.
Saturday, September 19
GL-only reposting from Stock and Account Value Comparison report
Adds Create GL Reposting Entries button for rebuilding General and Payment Ledgers while preserving stock valuations.
Clarify revaluation journal filters
Renames "Revaluation Journals" label to clarify that the checkbox controls inclusion of revaluation journals.
Validate bank reconciliation date ranges
Consistently validates reversed date ranges in both normal and reference-date modes.
Continue putaway allocation after undersized whole-uom rules
Allows putaway to continue through later warehouse rules when an earlier rule cannot accommodate whole units.
Validate shipping rule account company
Validates that a Shipping Rule's account belongs to the selected company.
Respect manual picking when mapping sales orders
Prevents automatic serial/batch allocation when Pick Manually is enabled in Pick List creation.
Desk-owned fetch wrapper over /api/v2
Adds @framework/ui/api module for all server calls in ui/src, exporting getDocument, listDocuments, countDocuments and CRUD operations.
Record page reads and saves through the v2 wrapper
Routes record page reads and saves through the v2 API wrapper with include parts and meta-with-children support.
Lists, counts and link search go to /api/v2
Routes every list, count, link search and list-settings call through desk-owned /api/v2 wrapper.
Linked fields in typst, bold/font size on every field, clearer renderer hint
Renders linked fields through Typst renderer, adds bold/font size controls to all fields, improves renderer hint organization.
Version history with restore, undo and redo buttons
Adds version history tracking with restore, undo and redo buttons to Print Format Builder.
Revert "fix(timeline): double fetch calls on sending email and broken socket connection"
Revert "fix(timeline): double fetch calls on sending email and broken socket connection"
Set patch as completed when after_install completes
Marks patches as completed when their after_install hook completes per issue #42090.
Use theme-aware tokens in sidebar for dark mode
Updates sidebar to use theme-aware design tokens for proper dark mode rendering.
Inspector spacing and builder review fixes
Fixes spacing issues in Print Format Builder inspector and reorganizes section border controls.
Missing linked target, canvas row spacing and once-only footer position
Handles missing linked targets gracefully, removes print-format class for correct row spacing, positions letterhead footer at page bottom.
Custom table columns, slash field picker and zoom dropdown in the builder
Adds slash command field insertion, canvas zoom dropdown, and fixes custom table column rendering.
Create the run lookup index with a portable helper
Replaces raw ALTER TABLE with portable frappe.db.add_index helper for cross-database compatibility.
Build a search index that does not exist yet
Fixes logic that prevented automatic search index creation when the scheduler calls build_index.
Drop with_link_titles from report view exports
Removes the with_link_titles parameter before passing report args to export_query to prevent unexpected keyword argument errors.
Allow filtering User by user_type with read permission
Allows filtering User by user_type with read permission per issue #42902.
Double fetch calls on sending email and broken socket connection
Moves subscription to shared store with reference counting, coalesces refresh calls, and rejoins rooms on reconnect.
Write whole number indent in excel export
Converts tree indent levels to integers before writing to Excel to comply with spec requirements.
Strip quote marker from link labels in export
Removes quote markers from Link and Dynamic Link columns in Excel/CSV exports to match desk display of linked titles.
Add SQL execution compatibility
Translates MariaDB SQL through SQLGlot before SQLite execution to handle placeholder conversion, quoting, and function compatibility.
Support query builder and search
Adds SQLite ON CONFLICT support, date/time and JSON functions, and FTS5 MATCH behavior for the query builder.
Make schema changes and backups safe
Preserves columns, indexes, constraints, triggers during table rebuilds and makes uncommitted schema metadata transaction-local.
Require write permission before fetching openid_configuration
Prevents unpermissioned users from fetching openid_configuration URLs via run_doc_method.
Validate cached onboarding lead/deal before navigating
Validates that cached lead/deal IDs still exist and are readable before navigating to them in onboarding.
Stop settings modal from shifting on scroll
Limits modal height and makes only tab content scroll so the settings modal stays fixed during scrolling.
Infer json_extract types from non-null values
Fixes type inference for json_extract to use non-null values instead of treating JSON null as Decimal.
Centre emojis in their grid cells
fix(emoji-picker): centre emojis in their grid cells
Stop the quoted-by badge scrolling posts and tables
fix(quotes): stop the quoted-by badge scrolling posts and tables
Service & Auth Integration
Integrates service and authentication systems in Central.
Add host supply and strategy trials
Adds configurable VM placement with provider host expansion and reproducible strategy trials.
Feature/credit decisioning
Adds credit decisioning engine for Loan Leads with rule-based approval logic and decision tracking.
Sync Accounts action on User Settings
Adds button to User Settings form to manually sync JMAP accounts.
Sort on a value returned by the column
Adds sortValue column option so columns can sort on a derived value instead of displayed content.
Server restart and sync + site trial
Adds server restart, sync, and site trial features to Central.
Pick the trial image by its Frappe version
Adds SIGNUP_IMAGE_TAGS configuration so signups land on a known Frappe version build.
Integrations settings panels
Ports Webhooks, Message Actions, and Document Notifications settings panels from Raven v2.
Reminders
Adds reminders feature to Raven with visual scheduling interface.
Scheduled message
Adds scheduled message functionality to Raven with UI controls for scheduling messages.
Add AWS server support
Adds AWS as a server provider for Atlas regions with infrastructure, catalog, server operations and bootstrap configuration.
Feat(tokens)!: one canonical design-token source, exported from frappe-ui/tailwind/tokens
Restructures design token pipeline with one canonical source and public API for token access.
Use room ID in untitled recording emails
Uses room ID instead of generic untitled label in recording notification emails when Meet Room has no title.
Use app dialog for leave confirmation
Removes browser-level beforeunload warning from Meet in favor of standard Frappe UI leave confirmation.
Restore navigation and palette actions
Restores Writer new-document command palette action and fixes Vite navigation by prebundling feather-icons.
Restore unload warning
Restores native unload warning for dirty editable presentations while preserving draft save behavior.
The domain field is there before the domains arrive
Initializes domains resource with empty array so domain fields appear in mail dialogs before data arrives.
Sync participant state after reconnect
Broadcasts participant media state to existing viewers after reconnect to keep indicators in sync.
An invite email names the occurrence it is about
Renders recurring event rescheduling emails from the occurrence's view with override folded in.
Invite mail goes out with CRLF line endings
Sends calendar invites with CRLF line endings to pass DKIM verification and land in inbox instead of junk.
Install the deprecated timezone names
Installs tzdata-legacy on Pilot images to support deprecated timezone aliases for sites upgrading to Ubuntu 24.04.
Delete workflows with the document they link to
Allows documents with workflows to be deleted by removing dynamic links when workflows are deleted.
Preserve pending capacity response
Documents the 503 pending capacity response and regenerates the Atlas API client for typed error handling.
Accept a delete of an image already retired
Makes image delete idempotent by accepting 202 for images already Archived or Deleting.
Send state updates only on a status change
Adds webhook condition to send Virtual Machine State deliveries only on insert or status change.
Allow Retry Transfer for System images
Allows Retry Transfer action for failed System image transfers, not just Machine images.
Keep the staging clone when a VM is released
Promotes dependent staging clones instead of destroying them so snapshot uploads survive VM deletion.
Retry the site sign-in faster
Reduces initial login retry delay from 2 seconds to 1 second for faster site readiness confirmation.
Cache the IP country with the Frappe cache API
Fixes get_country_from_ip cache call to use the Frappe cache API correctly, restoring welcome credits for new teams.
Claim routed Pilot admin hostname
Claims routed Pilot admin hostname after a server reports its routed gateway.
Keep routed hostnames out of the proxy map
Treats auto-routed VM hostnames as live instead of making proxy calls for them.
Skip the site alias while the bench has no site
Makes --site-pattern optional by skipping alias while bench has no site so Central setup succeeds at provisioning.
Resolve renamed sites in login endpoint
Resolves retained old hostnames to the renamed site in login endpoint and returns current site URL.
Verify Central tokens during bootstrap
Uses staged IMDS JWKS issuer during bootstrap window, then persisted configuration after completion.
Friday, September 18
Validation and line reference corrections for FRT
Fixed formula division-by-zero during validation, context variable shadowing and math function duplication.
Reset ordered_qty when a cancelled Sales Order is unlinked from its Purchase Orders
Cancelled Sales Orders left stale `ordered_qty` values that never cleared even when the Purchase Order link was removed.
Retain bom components without warehouse stock
BOM Stock Analysis removed components with no Bin record, overstating maximum production when stock wasn't yet stocked.
Report a Prospect quotation's territory
Quotations raised to a Prospect were reporting no territory after a prior change removed that case from the territory lookup.
Take the POS summary labels off one invoice, not a text sort
POS summary rows were pairing cost_center and payment mode from different invoices due to text-based aggregation.
Take the requested-item UOM pair off one line
Material Requirements report could pair one item's UOM with another's when the same item appeared twice in a request.
Take the job card secondary UOM off the representative line
Secondary items report was pairing one line's UOM with another's due to text-based sorting across database engines.
Include the mrp bucket that ends on to_date
MRP buckets starting on the To Date filter were never created, silently dropping demand records from that period.
Post-review workflow can reply inside existing review threads
Review workflow can post follow-up replies inside existing review threads instead of opening new reviews.
Add never_skip_patches hook to stop migration on patch failure
Apps can list patches in `never_skip_patches` that should halt migrations on failure instead of being skipped.
Static text, linked field and barcode elements for the beta builder
Print format builder now supports static text, linked fields and barcode elements with full canvas preview.
Drag recipients between the composer's To, CC and BCC rows
Mail composer recipient chips can now be dragged between To, CC and BCC rows, with rows opening on drag start.
Disable tab selection in awesomplete settings
Tab key was committing awesomplete's auto-highlighted first entry instead of moving to the next field.
Accept fractional seconds and unpadded hours in validate
Web Form datetime validation rejected valid dates with fractional seconds and unpadded hours.
Standardise text editor heading and list typography
Text editor headings and lists used Quill's stock sizing instead of frappe-ui's prose scale.
Use the amber badge theme
Onboarding chip, email delivery status and data import badges appeared grey after frappe-ui dropped the orange theme.
Require document type and field in add column dialog
Query report add-column dialog threw `TypeError` when submitted without required fields instead of listing the missing values.
Respect dark mode in splash screen
Splash screen remained in light mode even when dark mode was enabled globally.
Don't overwrite saved values with field defaults on edit
Field defaults were overwriting saved values when editing a submission, causing data loss and breaking dependent fields.
Preserve last checkin log during background reloads
First checkout from the mobile app was sometimes recorded as checkin after a morning checkin due to stale state during background reloads.
Translate student-facing interface messages
Discussion replies, billing login notice and cover image picker messages are now translated for all locales.
Add migration testing
LMS migration testing from v2.0.0 to current version following Frappe engineering handbook guidance.
Stop marking the profile image as mandatory
Profile image field showed the required asterisk despite being optional.
Open the template picker fully painted
Template picker preloads thumbnails so cards appear fully painted on first open instead of loading on scroll.
Match the command palette backdrop to other dialogs
Command Palette had a custom backdrop while the Keyboard Shortcuts modal used the default, breaking visual consistency.
Upload favicons and meta images as public files
Site favicon, page favicon and meta image uploads were private, breaking guest access and causing broken images.
Number card retry placement and result row count copy
Failed number card's Retry button was hidden, and result row count display was missing the actual count value.
Read valid JSON rows without normalizing in json_value
JSON normalization regex was corrupting valid documents and causing 3x slowdown on data store queries.
Warn on capitalised email and lowercase it on login
Login now warns on capital letters in email and normalizes it, matching signup behavior.
Sync upstream-added domains to site config
Domains activated via upstream path were routed by nginx but never written to site config.
Restore configs truncated by a full disk or a reboot
Config files were restored truncated after disk-full incidents, causing sites and benches to fail on restart.
Draw analytics chart lines at 1px
Dense analytics charts (CPU, Load Average) had overlapping 2px lines that hid each other, making them unreadable.
Add purge binlog action to server overview query
Site action dialogs failed to open because purge binlog wasn't whitelisted in the Server Overview query.
Even though the docs say otherwise i am pretty sure this works
Small fix despite documentation ambiguity.
New state delivery wire up
Integration for new state delivery events from Atlas servers.
Fall back to the admin password when a target has no API key
Targets authenticate with stored admin password when API key is missing or lost, improving resilience.
Keep a Mail Domain out of the hourly DNS verification
Mail Domain can skip scheduled DNS verification so hand-verified domains aren't unchecked by the hourly job.
Serve small, cacheable template thumbnails to the picker
Builder Hub serves small cacheable thumbnails alongside full preview images for faster picker rendering.
Edit properties for multi select
Bulk editing in Slides now supports stroke width, shadow, opacity, borders and text properties across selections.
Keyboard shortcuts dialog
Calendar has a keyboard shortcuts dialog opened with `?` or from sidebar menu, with `E` to create events.
Create, edit and delete calendars
Users can create, rename, recolor, set default and delete calendars from sidebar or settings, with color persistence.
Shared calendars
Calendars shared from other accounts appear under Shared Calendars without switching accounts, read-only with full permissions control.
Add Suite command palette
Suite now has a command palette with contextual search, app navigation, creation actions and consolidated commands.
Add bind mount overrides for docker volumes
Docker compose now supports bind mount overrides for volumes without requiring compose file customization.
Add helpers to rename a server admin domain and a site
Central helpers let operators rename admin domains and sites on a server through the Pilot API.
Create servers through durable regional operations
Central creates servers on configured regions via durable operations that record state before dispatch, preventing double-creation.
The code editor family at frappe-ui/code-editor
ADR and spec for redesigning CodeEditor as a family supporting multiple use cases and rendering contexts.
The code editor family at frappe-ui/code-editor
CodeMirror 6 component family with engine, renderless component, and kit at frappe-ui/code-editor.
Route site and custom domains through the regional proxy
Central can route sites and custom domains through the regional Atlas proxy, recording route state and failure reasons.
Check and subscribe the app to the WABA webhook
WhatsApp account form can verify webhook subscription and fix it in one click if the app wasn't subscribed.
Resize servers through Atlas
Customers can resize servers via Central, which stops the VM, applies compute and disk changes, then restarts.
Add provider-defined domain route policies
Providers can define TLS termination and proxy behavior for each route policy accepted during domain registration.
Let pilot register verified domains
Pilots can register verified custom domains with DNS record validation, storing the route on Central.
Bake the domain provider into the pilot image
Pilot image now includes the domain provider for direct custom domain routing without per-region setup.
Configure Central webhooks
Central-only endpoint configures signed Atlas webhook deliveries with stable payload contracts and retry policies.
Template header color should inherit
WhatsApp template header color wasn't inheriting from parent styles.
Send cpu millicores and a disabled firewall to Atlas
Central was sending vCPU count instead of millicores to Atlas, causing server creation to fail.
Point Wiki desktop icon at /wiki-app on existing sites
Wiki desktop icon on existing sites still pointed to the old `/wiki` path, returning 404.
Keep pilot admin sessions open for one hour
Admin sessions opened from Central ended after 5 minutes, forcing frequent re-logins.
Blank print designer page when page_head is undefined
Print designer page opened blank on Frappe v15 because `page_head` only exists from v16 onwards.
Remove misleading ⌘K hint from search slots example
Combobox search example showed a misleading ⌘K hint that wasn't wired to anything.
Fix!: picker open at mount, List select-all, Tabs reset, TabButtons.focus()
Pickers mounted open had no draft, no aria-controls ID, and no focus move; List select-all, Tabs and other behaviors were broken.
Migrate ListFooter page length picker from removed buttons prop to options
ListFooter page length picker rendered nothing after frappe-ui dropped the `buttons` prop from TabButtons.
Repoint pilot_endpoint when the admin domain changes
Renaming an admin domain didn't update `pilot_endpoint` in site configs, leaving sites pointing to the old domain.
Separate public site TLS from certificates
Public site TLS state and origin certificate termination were conflated, preventing edge-terminated wildcard sites from working over HTTPS.
Keep the requested host on ACME challenges
HTTP-01 ACME challenges for custom domains returned 404 at the proxy because the forwarded host was incorrect.
Name the certificate domain when issuance fails
Certificate issuance errors reported the site hostname instead of the actual domain being issued.
Widen the wildcard suffix and the domain dialog
Long wildcard suffixes and domain DNS tables were truncated in the New Site and Add Domain dialogs.
Use https for a wildcard admin endpoint
Admin endpoints under wildcard domains were incorrectly falling back to HTTP instead of using HTTPS at the edge.
Clear the bench cache after an admin domain change
Frappe cached site config prevented `pilot_endpoint` from updating, so sites still pointed to the old admin domain.
Thursday, September 17
Use serial no wise valuation switch on item
Items can now opt out of serial-number-wise valuation to handle millions of serial numbers without individual cost tracking.
Update modified for last purchase rate
Updated modified timestamp when last purchase rate changes.
Render letter head jinja in statement of accounts pdf
Statement of Accounts PDF now renders template-based letter head Jinja correctly instead of showing broken template syntax.
Negative stock value for moving average item with mixed batchwise valuation
Moving Average items with mixed batchwise valuation now calculate outward rates correctly instead of draining stock value.
Filter item group defaults by company and non-group records
Item Group defaults now filter accounts and warehouses by company and exclude group records.
Use stored posting_datetime when reposting stock ledger entries
Stock ledger reposting now uses stored posting_datetime instead of rebuilding it, preventing skipped entries and wrong balances.
Avoid pricing rule help template errors
Pricing Rule help text no longer triggers template compilation errors when already-rendered HTML is reassigned.
Prevent max recursion on supplier scorecard save
Creating or updating a Supplier Scorecard for a supplier created on the last day of a month no longer causes infinite recursion.
Clear stock value for zero-quantity balances
Zero-quantity balances now have zero stock value, preventing ledger entries with zero quantity and non-zero value.
Show item description in Classic print formats
Item descriptions now appear as secondary lines under item names in Classic transaction print formats.
Apply mrp manufacturing buffer as a duration
Manufacturing buffer now correctly adds to lead time instead of reducing it.
Drop the editor stylesheet import frappe-ui no longer exports
Removed unsupported frappe-ui stylesheet subpath import from ActivityTimeline component.
Workflow automations
Frappe now supports declarative workflow automations: when something happens to a record, do these things in order without code.
Publish an import map for stored Client Scripts
Stored Client Scripts now have access to vue, vue-router, and app-published packages through an import map.
Let an app publish names to the import map with an `import_map` hook
Apps can now declare import_map hooks to publish names to the record page's import map for stored Client Scripts.
Header ownership — props forwarding, component in both zones, pinned Save, clear()
Record page header now supports props forwarding, component placement in both zones, pinned Save button, and clear() method.
Page.frame, bands above, between and below the page's regions
Record page now surfaces page.frame as one list with header and body regions that can host bands before, between, or after.
Add page.body, the body row as one list of columns
Record page body row is now exposed as one list of columns with built-in form and panel columns.
Keep docinfo live over the docinfo_update socket
Record page docinfo now stays fresh over the socket instead of staling when assignments or comments happen in other tabs.
Publish docinfo_update for shares, tags and favourites
Record page now receives live docinfo updates for shares, tags, and favourites made in other tabs.
Page.form, the Details form as one list, and page.form.tabs
Record page Details form now surfaces as one list with section ownership and tab support.
Let a host place a component part in a FormLayout column or between sections
FormLayout now accepts custom Vue components as parts in columns or between sections for deep customization.
Listen to client_script_changed and drop the cached scripts
Stored Client Scripts now invalidate correctly when changed in another tab.
Render rich-text merged fields as HTML in print formats
Editor fields in merged cells now render as HTML in print formats instead of stripped plain text.
Show configured Link titles in reports
Doctypes with "Show Title in Link Fields" now display titles consistently in both query reports and Report Builder.
Truncate legend in non circular chart
Non-circular chart legends now truncate correctly after regression fix.
Translate dock entry titles on resolve
Dock entry titles now translate on resolve.
Align file preview row in RTL
RTL languages now display file preview rows with correct alignment.
Revalidate length after sanitization
HTML sanitization can mutate fields after validation; length check now runs after sanitization to prevent data loss from exceeding column limits.
Validate condition fields on every save
Naming rule conditions now validate on every save, not just when the document type changes.
Publish `crm/lib` to the record page's import map
CRM now publishes crm/lib to the record page's import map for stored Client Scripts.
Adopt frappe-ui Password, Spinner, Alert, ErrorMessage and CodeEditor
LMS now adopts frappe-ui Password, Spinner, Alert, ErrorMessage, and CodeEditor components across Settings and Payment Gateway forms.
Blank a non-finite value before the result is cached
Non-finite values now blanked before caching to prevent deserialization failures on both versions.
Notify admins of an Insights release with security fixes
Insights admins now see security update notices in the sidebar, not just in Desk.
Telemetry event catalogue and the events that answer its questions (backport #1408)
Version 3 backport of telemetry event catalogue.
Telemetry event catalogue and the events that answer its questions
Insights now ships telemetry event catalogue documenting shipping section events with performance and query metrics.
Store a chart config in one shape, instead of repairing it on load
Chart configs are now stored and validated once instead of repaired on every load.
Find and label images by their tags
Cargo now finds Atlas images by tag and labels Pilot images for later search.
Disable the VTS module by default
Nginx VTS module now disabled by default, removing unused shared memory overhead and metrics dumps.
An Agenda view, and the grids at phone width
Calendar library now supports Agenda view and responsive grid layouts at phone width with 52 clean commits.
Hover styles only where hovering is possible
Hover styles now only apply on devices that support hovering, fixing ghost hovers on touch screens.
DKIM keys under fixed selectors that never rotate
Domains keep automatic DKIM management with fixed selectors and rotation pinned a century out for stable records.
Soften the reaction chip border and add a hover fill
Reaction chips now have softer styling with hover fill to indicate interactivity.
Send on enter and break the line with shift+enter
Composer now sends on Enter and breaks lines with Shift+Enter like standard messaging apps.
Add getting started and troubleshooting guide
WhatsApp app now has getting started and troubleshooting documentation for site admins.
Default All Spaces filter to Published and group unpublished spaces
All Spaces view now defaults to Published filter and groups unpublished spaces in their own collapsed sidebar section.
Add cmd+k command palette
Wiki now has a command palette (⌘K) for cross-space page search and navigation.
Add Atlas signing credentials
Central can now issue Atlas regional credentials with Ed25519 signing while preserving Pilot and service authentication.
Assign permanent team tenant ids
Central Teams now have permanent numeric tenant IDs for Atlas network isolation.
Add Atlas Tag labels and unlink virtual machines from their image
Resources now use arbitrary key-value tags instead of fixed fields; virtual machines no longer hold links to their boot image.
Keep tenant addresses with a reserved flag
Public IPv4 addresses now persist on reserved flag; unreserved addresses return to the shared pool when detached.
Oversubscribe virtual CPUs on a host
Hosts now oversubscribe CPU while placing VMs based on available memory and storage only.
Support fractional CPU entitlements
Virtual machines now support fractional CPU sizes from 100 to 32000 millicores with exact systemd CPU quota enforcement.
Respect the 24-hour customer service window in the composer
Composer now respects Meta's 24-hour customer service window and requires templates to reopen conversations.
Return variable mappings from get_sendable_templates
Template variable mappings now return with sendable templates so users can preview and fill variables before sending.
Report skipped coverage as unchanged
Suite CI now reads coverage from completed test steps and reuses base-branch coverage only for intentionally skipped suites.
Mobile layout, event cards and agenda view
Calendar now supports mobile layouts with month, week, day, and agenda views; events display as bottom sheets on phones.
An app switcher, mail's search in the title row, and the suite as one PWA
Mobile apps now have a unified app switcher with the suite as one PWA and mail's search in the title row.
Add firewall support
Virtual machines now support configurable firewalls for public and mesh traffic with stateful IPv4 and IPv6 filtering.
Wait for space capabilities before opening a change request
Read-only users no longer enter change request mode and see perpetual loading skeletons.
Don't mark spaces with the All role as restricted
Spaces with only an "All" role no longer show a restricted lock icon.
Store events in the database during ingest
Pulse events now persist to the database immediately, with 503 on failure to trigger client retries.
Make each WireGuard peer routable
WireGuard mesh tunnels now route correctly between hosts with proper address prefixes.
Clear tree cache when a space route is renamed
Space route renames now clear the sidebar tree cache, fixing stale 301 redirects.
Scroll rail to keep active heading visible
Table of contents now scrolls to keep the active heading visible.
The title inset's variable survives Tailwind
Mobile page header title inset CSS variables now compile correctly through Tailwind and lightningcss.
Fix(TreeView)!: expansion is a keyed model, not a write to your nodes
Tree expansion state is now managed as a keyed model instead of writing to caller nodes, fixing shallow watchers and undo logs.
Cap memory for asset builds
Asset builds that exceed memory limits now fail gracefully instead of being killed by the kernel.
Tail bench log dir only, not the site mirror
Bench-level logging no longer duplicates site-level log lines in datum.logs.
Use the real fluent-bit install path, not a guess
Log shipper no longer crashes on fresh installs by checking the actual fluent-bit installation path.
Lazy load S3 deps
S3 dependencies now load lazily to avoid import failures.
Match the host address in a port forward
Guest VMs can now reach remote servers on ports 80 and 443 with corrected port forward address matching.
The Week grid's cursor, lucide SVGs that ignore their size, and a sheet warning
Week grid cursor, lucide SVG sizing, and BottomSheet accessibility improvements.
Wednesday, September 16
Handle missing bank reconciliation document types
Normalizes omitted document types in bank reconciliation to prevent TypeError in get_linked_payments.
Show linked record count on Supplier Scorecard connections
Removes overridden method that was suppressing record counts on the Supplier Scorecard dashboard.
Consume batch slots newest first for LIFO items
Fixes LIFO item valuation to consume batch slots in the correct order, preventing incorrect reporting of issued stock.
Scope stock ageing batch and serial age to the warehouse
Scopes batch and serial age cache to include the warehouse to prevent inconsistent aging across different warehouse filters.
Do not decorate self-referential links with the row's own title
Prevents Link fields that reference the same doctype from being decorated with a title, which was displaying incorrect information.
Item selection writes to the child table that fired it
Fixes item selection callbacks that were inadvertently writing to standard `items` table instead of the custom child table that triggered the selection.
Value stock entry rows as of the posting date
Values stock entry rows using the valuation rate as of the entry's posting date instead of the current rate, preventing drift on reposts.
Asset depreciation table stays empty if you check the box before entering the amount
Ensures depreciation table populates correctly when Calculate Depreciation is enabled before entering the purchase amount.
Ask for a BOM before creating MRP work orders
Replaces error-only flow with a dialog allowing users to select or specify a BOM before creating work orders for items without a default BOM.
Draw a stored script's icon from the shell's sprite
Renders client script lucide icons from the shell's sprite instead of frappe-ui's, supporting icons even without prior bundle use.
Show mobile list subject bold only for unread rows
Shows bold subject text only for unread list items on mobile, improving visual distinction.
Keep the remote error message in FrappeException
Preserves remote error messages in FrappeException instead of raising exceptions with no message.
Dock z-index issue
Resolves z-index conflict between dock and grid components.
Open a single doctype on its record, never a list
Fixes sidebar items for Single doctypes to open the record page instead of a non-existent list view.
Improve contrast of checked checkboxes
Increases contrast of checked checkboxes in dark mode for better visibility.
Make welcome message translatable and close div tag
Makes portal welcome message translatable and fixes an unclosed HTML div tag.
Make child table heading text visible in dark mode
Improves contrast of child table headings in dark mode for better readability.
Keep RTL languages from flipping nav arrows
Extends rtl:ignore block to prevent calendar navigation arrows from flipping in RTL mode.
Show Link titles in print previews
Displays Link field titles in print previews, matching behavior in PDF output and standard views.
Clear button busy state when callback returns a jQuery deferred
Fixes buttons that return frappe.call to properly clear busy state instead of throwing "response.finally is not a function".
Keep list format filters when merging link filters
Preserves list-format link filters when merging with set_query filters, preventing search errors on combined filter conditions.
Drop filter values from export file name
Removes filter suffixes from report export filenames to avoid exceeding the 140-character file name limit.
500 with an unparseable body when an after commit callback fails
Returns valid JSON error responses when after-commit callbacks fail, instead of HTML that cannot be parsed.
Stable home default view and derive doctype in set_as_default
Resolves home default view in a fixed order and derives doctype from name when not provided in set_as_default.
Ignore autorepeat keydown for command palette shortcut
Ignores autorepeat keydown events for the command palette shortcut to prevent multiple triggers from key hold.
Russian "Checkout" wording implied payment
Updates Russian translation of "Checkout the course" to "View" since the links open free content without payment.
Add Staging status for pages
Adds a Staging status for pages so they can be Draft, Staging, or Live with corresponding badges and filters.
Show creation timestamp when sorting pages by Last Created
Shows creation timestamp on page cards when sorted by Last Created instead of always showing last modified.
Charts render through frappe-ui charts v2
Integrates frappe-ui's chart library for consistent rendering, number formatting, and currency display across number cards, bar charts, and other visualizations.
Stack bars beside a right-axis line, and drop cleared axis bounds
Restores stacking for bars when an SLA line is on the right axis and drops empty axis bounds on load.
Show the shared badge on the server page to every user
Shows the Shared server badge to all users, not just support staff.
Hide Update Available while Restore Tables shows
Hides the Update Available button when table restore is needed to prevent confusing update prompts.
Refuse a table restore when the site answers requests
Prevents table restore when the site is responsive to avoid overwriting user data entered during maintenance mode.
Add translation of address_picker_card.html
fix: add translation of address_picker_card.html
Login and translation in macros.html
fix: login and translation in macros.html
Setup central for humans and agents
Establishes contribution guidelines for both human and agent developers.
DateCalendar, DateRangeCalendar, PickerShell on Popover
Adds standalone DateCalendar and DateRangeCalendar components, rebuilds three date pickers on them, and introduces PickerShell on Popover with manual trigger and auto-focus control.
Stop /g writing an Error Log per git call
Prevents git operation errors from creating error logs that can cascade into infinite loops.
Adapt shopping cart to erpnext permission checks
Updates cart to use TaxService and create sales transactions as Admin to bypass permission checks on Item and Account.
Resolve the job timeout without ever failing the enqueue
Hardens job timeout resolution to handle JSON arrays, string values, and missing keys without breaking the enqueue path.
Show audio indicator in preview
Shows local microphone audio indicator in the meeting preview and publishes replacement stream after microphone switches.
Animate audio bars with transforms
Uses center-origin transforms for audio bar animation instead of interrupted height transitions.
Improve mobile overflow controls
Moves meeting information to mobile overflow menu and shows it in a mobile-friendly dialog.
Use consistent tooltips
Replaces native title hover text with frappe-ui Tooltip components for consistent styling.
Stabilize raised hand E2E selector
Exposes raised-hand indicator through accessible label and updates E2E assertions.
Edits lost on save
Implements web locks to prevent concurrent edits, prevents stale saves from overwriting edits, and maintains correct state across multiple tabs.
Misc editor fixes
Fixes slide deletion navigation, transition duplication on paste, and Cmd+X to remove and copy elements.
Monday, September 14
Keep the table qualifier in the legacy MAX() sort column
Ambiguous column reference in postgres when joining tables with unselected group-by and order-by; table qualifier now preserved in MAX() argument.
Drop the exists() rewrite for child-table filters
Legacy exists() rewrite removed joins needed for child table resolution and changed result cardinality; reverted to preserve join behavior.
Cast JSON columns in order by, group by and distinct selects
Extended JSON casting to ordering, grouping, and distinct operations; fixes list sidebar grouping and sort selectors on JSON fields.
Cast JSON columns before comparing them in filters
Postgres json columns lack equality operators; queries now cast to varchar before comparison to avoid operator-not-found failures.
Prewarm Frappe memory snapshots
One-shot Pilot boot service in baked images performs real Frappe login and Desk load before Atlas captures warm memory snapshot.
Warm the Pilot admin before the snapshot
Admin is now warm in memory snapshot by reading bind config and probing its API before snapshot is taken.
Verify remote tokens from an on-disk JWKS cache
Added JwksCache to persist issuer public keys on disk; remote tokens now verify from cache without network fetch when key is present and cache is fresh.
Narrow the JWKS cache record before the staleness check
Type checking issue where mypy rejected passing potentially-None cached record to staleness check; now validates non-None before lookup.
Keep the socket-activated admin alive for 10 minutes
Admin idle timeout of 60 seconds caused it to stop before snapshot was taken; raised to 10 minutes so admin remains warm in memory.
Send a valid prewarm login request
Prewarm login lacked site Host header and valid JSON body, so desk and admin remained cold in snapshot; request now properly formatted.
Reset guest DNS and time sync after resume
VMs resumed from snapshots waited 40 seconds for DNS and clock sync; now resets these services immediately after resume.
Sunday, September 13
Record page and shell polish from a walk
Small polish from a walk of the desk v2 record page: breadcrumbs refactor, record dropdown cleanup, icon bindings, and whitespace fixes.
Favourite star in the header and image upload on identity
Adds a favourite star on page.header to toggle the reader's favourite and list everyone who favourited the record; enables image upload on the identity built-in.
Treat page_length=0 as no limit in link search
MultiSelectList filters on translated doctypes showed "No values to show" because raw-SQL link queries received LIMIT 0 instead of respecting the no-limit convention.
Dereference symlink in pre-build asset packaging
The tar archive pointed to symlinks in node_modules that did not exist in pre-built assets.
Bind refresh tokens to clients
Refresh-token validation checked only the token hash and status, not the authenticated client, so Client A could redeem Client B's refresh token in violation of RFC 6749 section 6.
Bind token revocation to clients
Token revocation searched only by token hash without verifying the token belonged to the authenticated client, allowing any client to revoke another client's tokens in violation of RFC 7009 section 2.1.
Enforce client authentication
Frappe's auth rejected OAuth HTTP Basic credentials before OAuthLib received them, and the OAuth validator accepted both Basic and POST secrets regardless of the configured Token Endpoint Auth Method, violating RFC 6749 section 2.3.1.
Misc
Retires images safely, reclaims archived Machine images, filters image listings, and allows virtual machines to claim unowned pool addresses.
Map a public IPv4 for host-originated traffic
The public IPv4 map applied only to forwarded traffic; this adds the same map for traffic that a host process starts.
Offer shared pool addresses when provisioning
fix(cargo-server): Offer shared pool addresses when provisioning
Complete recording publication
Accepts recorder upload query parameters, aligns SFU grant lifetime with startup, and sends room owners branded, templated completion emails with Drive artifact links.
Make participant cleanup resilient
Centralizes participant cleanup and completes independent cleanup steps even when one removal fails.
Reserve bench names that collide with host-wide units
Reserves bench names `pilot`, `bench`, and `site` to prevent collisions with host-wide systemd units.
Settle the 1.0.0 API decisions
Settles 14 API decisions for frappe-ui charts v1.0.0, including label props, data label display, and funnel percentage handling.
Add `pilot setup central`
Adds a command to enable Central management from the CLI with validated hostname patterns instead of hand-editing config files.
Add --no-dev to skip apps' dev extras
Adds --no-dev flag to skip apps' dev extras, fixing unresolvable dependencies on frappe develop.
Track Pilot image releases
Atlas enables Cargo Pilot release tracking after bootstrap image migration completes, with System Manager controls to enable or disable it.
Ask for the default storage cluster
Atlas now asks for the default storage cluster during setup.
Configure Atlas from deployer settings
Complete provider, DNS, catalog, certificate, and system image setup from one validated TOML file before the VM reports ready.
Initialize Pilot images without dev dependencies
Passes --no-dev when Pilot initializes the baked image bench to avoid unresolvable dev dependencies.
Sync Pilot releases every minute
Changes the sync_pilot_releases scheduler from hourly to every minute.
Add system image snapshots and release tracking commands
Creates built Cargo images as Atlas System images and adds commands to enable or disable Pilot release tracking per site.
Spawn the region's cluster without an operator
Cargo now builds and sets up a region's Garage cluster on its own via scheduled ensure_cluster instead of requiring manual setup.
Verify the image before it goes to Central
The bake now verifies the image serves its site before handing the host to Central, using `pilot setup central` instead of a staged Python file.
Wait for the build machine to boot
Builds now wait up to 60 seconds for the machine to respond to ping and 180 seconds for sshd before sending the provision script.
Fix the names, the password and the wait in a build
Standardizes bench and site names across builds, removes stored site passwords, and adds boot waits to prevent SSH timeouts.
Find the base image instead of naming it
Builds now find the base System image by querying Atlas instead of naming it, fixing the "image does not exist" error on every build.
Track Pilot releases and keep one image per pair
An image is now one Pilot release on one Frappe version; Cargo can follow Pilot's releases by itself with a new "Track Pilot Releases" setting in Cargo Settings.
Restore apps submenu content
The Apps submenu rendered an unlabeled empty row instead of mounting AppSelector after frappe-ui changed how it handled legacy component menu options.
Flush the build machine before snapshotting it
A VM booted from a baked Pilot image served 502 on every site because the image contained empty files; flushing the page cache before snapshotting prevents this.
Reveal the current page in the editor tree
Opening a page in the editor from the reader's Edit link left its parent groups collapsed and the page off screen.
Saturday, September 12
Show reserved stock in batch balance history
Batch-Wise Balance History now shows how much stock is reserved for each batch using aggregated query.
Expect a naming rule counter per resolved prefix
Updated test after frappe#42690 moved document naming counters from rule-wide to one per resolved prefix.
Fix(regional)!: remove `irs_1099_print` whitelisted method
Removed an obsolete whitelisted method that exposed unrestricted document access.
Add permission checks on `invoice_discounting.get_invoices`
The method returned unpermissioned invoice data; whitelist enforcement now honors read permission on Invoice.
Coerce cost_allocation_per to float in BOM cost allocation
BOM cost allocation rate comparison treated string and float values separately, failing when a rate was stored as text.
List billable sales orders oldest first
The Sales Invoice "Get Items From > Sales Order" picker re-sorted custom-query results by relevance, placing oldest orders last and disrupting selection order.
Prevent disabled items from being used in BOM
A BOM copied or amended retained disabled Item rows; the Item link field filter and validation were inconsistent.
Calculate batch bundle valuation per unit
Amending a Material Receipt to swap batch details inflated unit rate by dividing bundle value by 1 instead of actual bundle quantity.
Draw the record page's panel from page.panelSections
Panel now renders from a declarative `page.panelSections` list with three built-ins (Info, Activity, Comments) and doctype-defined Side Panel sections.
The record page's field region — Details form, save channel, dialog hosts
Builds the Details form region, save flow, and dialog infrastructure for the desk v2 record page.
Add `Ignore Versioning` setting for docfields
New setting allows fields to opt out of document versioning, reducing version overhead for high-frequency updates.
Make the panel's people built-in editable
Panel people section now supports inline assign/unassign, share/unshare, and tag/untag from the record page.
Key naming rule counters per resolved prefix
Document Naming Rules kept one counter for all resolved prefixes, so `.YYYY.` prefixes incremented across year boundaries; now keyed per resolved value.
Close inherited descriptors before the re-exec
Bench runner leaks file descriptors across restarts because exec preserves non-close-on-exec descriptors; accumulation hits system limits after ~1000 restarts.
Add request back into render_safe_globals
Breadcrumb rendering in print format needed the `request` object in template globals.
Honour an explicit Currency Precision of 0 in System Settings
Currency Precision of 0 was treated as unset across `get_field_precision()` and `fmt_money()`, ignoring explicit zero-decimal configuration.
FormLayout tabs select by value on frappe-ui beta.63, and a Link title before search
FormLayout was binding `activeIndex` instead of `value` after frappe-ui beta.63, leaving tabs unselected; also adds Link title support before search state.
Keep POT updates in a single self-updating PR
Weekly POT regeneration job now reuses single stable branch instead of creating dated branches, eliminating accumulation and merge conflicts.
Prevent conversion of lost leads
Disabled lost-lead conversion UI and enforces restriction in conversion API.
Translate Select field option labels in frontend
Select field options rendered English labels from DocType meta even when translations existed; wrapping in `__()` now shows localized text.
Show quick filters in mobile list view
Quick filter fields were only rendered in desktop ViewControls, so mobile users had to open a popover to filter by standard fields.
Add google api, calendar, badge assignments; redo settings ui
Restructures LMS settings architecture into separate config/list/form pages for Coupons, Transactions, Payment Gateways, Zoom, Google Meet, and Badges; settings now URL-driven instead of modal state.
Stop offering evaluation slots that have already started today
Evaluation slot picker showed today's past slots (e.g., 09:30 at 14:47) without comparing against the clock; validation rejected submission.
Carry contact-us images inside the email instead of linking them
Pasted images in Contact Us form arrived as links to private files; recipients' mail apps could not open them; now embedded as proper inline attachments.
Enable Wazuh in all servers
Deploys Wazuh security agent across all servers for threat detection.
Install rclone on servers created from an image
Dashboard-created servers boot from pre-baked images and skipped the full setup playbooks that install rclone.
Show only a server's own sites under a bench group
Bench groups showed the entire group's site list under each server card; site count and deployment status badges also counted across the group instead of per-server.
Add server side validation for new site and server
Unpaid teams were prevented from creating sites and servers only on the client; server-side enforcement now blocks unauthorized creation.
Update README formatting and remove outdated information
fix: update README formatting and remove outdated information
Add integration with cargo.
Integrates Atlas with Cargo for coordinated infrastructure operations.
Remove support cloud init flag from vm image
Removes obsolete cloud-init configuration flag from VM images.
Bind each token to its issuer, scopes, and tenant
Tokens now carry issuer namespace, scopes, and tenant in signed claims; callers need no validator changes for new tokens.
Serve and migrate bootstrap images without object storage
Atlas can publish and boot first VM image as public site Files, then migrate into object storage after credentials are available.
Complete the desk setup wizard
Install now walks the setup wizard without answers and pins time zone to UTC (or configured zone), unblocking subsequent operations.
Install a production Atlas machine from one script
Single script installs Pilot, bench, site, atlas app, production nginx, and first guest image on fresh Ubuntu 24.04 without operator interaction.
Add the atlas-deployer CLI
Adds `atlas-deployer` command with create, start, stop, restart, status, ssh, logs, setup, resize, and destroy operations for managing Atlas VMs.
Virtual Machine Migration
End-to-end VM migration across Atlas control plane and Metal hosts with Ed25519 keys, scoped JWTs, durable migration records, and resumable ZFS copies.
Add email templates for notifications and more
Adds email templates for notification and communication flows.
Service backend
Ensures internal admin calls route via IPv6 address, sets up service backend and public URLs, adds webhook-based telemetry delivery.
Atlas integration
Integrates Cargo with Atlas for infrastructure management.
Add sync machine button & correct network address
Adds machine sync controls and corrects network address configuration.
Take Atlas and Proxy bearer tokens
Enrolment now accepts signed bearer tokens for Atlas and Proxy instead of key/secret pairs, enabling token-based auth.
Publish gateway proxy routes
Cargo publishes regional S3 and S3 admin domains through proxy before object storage cluster becomes Active, with wildcard domain mapping.
Gateway nginx
Adds nginx on gateway node to route between admin and S3 API, removing other dead ports.
Bake Pilot images for Central auto bootstrapping
Baked Pilot images now boot as managed hosts awaiting Central credentials, reaching a running state without manual setup.
AI settings section
New AI settings panel in Raven for configuring AI-related features.
Spend the sequential ramp from the deep end
Single-series bar charts used paler color than first series in stacked chart; ramp now starts from deep end with consistent spacing.
Support mobile video fullscreen and empty tab slots
Native WebKit fullscreen on iPhone was blocked; now enters fullscreen when standard Fullscreen API is disabled, with synchronized transitions.
Keep the space logo picker inside the viewport
Space Logo picker popover pushed off the top of short windows; repositioned to stay inside viewport bounds.
Keep a page deleted in a draft visible until the merge
Pages deleted in draft mode vanished from the editor tree, so authors never published the deletion; now stays visible with a struck-through "Deleted" status.
Use friendly date format in event and schedule pickers
Event and schedule pickers now render user-friendly date format instead of raw strings.
Update maharashtra women's professional tax exemption to 25000
Bumped ceiling for women's Professional Tax exemption from the prior limit to ₹25,000 inclusive.
Install the app after production setup
Install hooks enqueued jobs before Redis started; moved install after production setup brings up workload services.
Resolve the Go toolchain path
Build failed on hosts without system Go because toolchain path was relative; now resolved to absolute path.
Friday, September 11
Align monthly bucket labels with demand dates
Fix Material Requirements Planning report bucket labels appearing one month ahead of demand dates.
Do not rebuild the Warehouse tree on an account map miss
Stop treating missing warehouse account maps as corruption that requires tree rebuild.
Recompute reference doc reqd on asset type change
Recompute mandatory flags on purchase_receipt/purchase_invoice when asset type changes.
Avoid TypeError on new Work Order when company is not set
Fix get_default_warehouse() TypeError when creating Work Order with multiple companies and no default.
Exclude fully billed orders from the invoice picker
Exclude fully billed Sales Orders from Get Items From selection when invoice mapping checks pending quantity.
Recalculate billing status of returned delivery notes
Recalculate billing percentage for Delivery Notes that remain to Bill or Partially Billed after returns.
Apply company restriction to Item Price
Item Price now inherits Company Restriction from the Item it links to.
Composer submitting state, footer slot, toolbar start and body fade
Add submitting state, footer slot, toolbar start slot, and body fade animation to email/comment composers.
A Desk v2 row in desk v1's user menus
feat: a Desk v2 row in desk v1's user menus
The user avatar and its menu at the foot of the rail
Add user avatar at foot of rail with menu for settings, theme, Desk v1 link, and logout.
Persist the list's columns, sort and quick filters per person and per site
Save list customizations per user and support site defaults for System Managers to set.
Dashboard count and connection filter use the wrong child table with a duplicate link field
Use correct child table when dashboard connection link appears in multiple child tables.
Render website analytics group by column as text
Escape grouped field values in website analytics to render as text instead of HTML.
Align form builder selector icons with their input
Align Icon, Color, and Phone field selector icons with their input containers in form builder preview.
Implicitly fetch parent name for child queries in QB
Auto-inject parent name field into child table queries to prevent silent data loss.
Handle missing preload library in Postgres Query Stats
Show instructions when pg_stat_statements extension exists but server library is not preloaded.
Translate only backtick-delimited identifiers for postgres and sqlite
Only translate backticks that delimit SQL identifiers, not backticks inside string literals or comments.
Render overlays in the top layer
Render island overlays in the top layer to prevent desk chrome from painting over dialogs.
Don't prefill child table when link is on the parent
Stop prefilling child table rows when creating from Connections tab if link already exists on parent.
Clear doctype cache when a workflow is deleted
Clear doctype cache on workflow deletion to prevent DoesNotExistError on subsequent saves.
Backfill the social login key configs
fix(social_login_key): backfill the social login key configs
Add configurable option to mark absent on same day
Add Absent Buffer (Days) field to Shift Type (default 1); set to 0 to mark absent same day.
Load translations from the endpoint frappe v17 exposes
Fix PWA translation loading by using frappe v17 endpoint instead of removed v16 method.
Mark absent for overlapping shift assignments in auto attendance
Fix auto attendance not marking Absent when employee has multiple overlapping shift assignments and no default shift.
Reset hardcoded letter head on reports
Remove developer-site letter head hardcoding from Employee Exits, Leave Ledger, and Income Tax Computation reports.
Resolve false not-permitted redirect and broken session expiry handling
Fix rapid reload causing false not-permitted redirects; add return statement to abort navigation on in-flight request cancellation.
Add availability scheduling for quizzes and assignments
Add opt-in scheduling to limit quiz/assignment availability to a configured time window.
Replace pager with wrapping question chips and add Previous
Replace windowed question pager with wrapping numbered chips and add Previous button for better navigation.
Reveal the signup result banners on released frappe
Make signup success/failure banners visible by wrapping relative-time text in span.
Improve text contrast in programming exercise submission
Fix run button text color override and improve compiler error message visibility.
Resolve attributeError in count_matching
Fix batch count query using outdated method that broke batch list footer.
Enrollment update
Move enrollment count updates to after_insert/after_delete hooks and use atomic SQL to avoid race conditions.
Use consistent title casing for shortcut and menu labels
fix: Use consistent title casing for shortcut and menu labels
Open color pickers from the swatch only, and show the value in the New Token dialog
fix: open color pickers from the swatch only, and show the value in the New Token dialog
Add "Redeploy without cache" for cache build failures
Add "Redeploy Without Cache" button on pipeline detail page for Docker build cache failures.
Show the archived sites when a team has no live sites
feat(dashboard): Show the archived sites when a team has no live sites
Show the auto update window in the site dashboard
Display auto update time window and site timezone in Configure Auto Update dialog.
Link the restore doc in the archived site banner
feat(dashboard): Link the restore doc in the archived site banner
Add set additional config button and group the actions
Add Set Additional Config button to Server, Database Server, and Proxy Server forms for easier retries after job failures.
Allow parsing of anchor tag in notif panel
fix(ui): Allow parsing of anchor tag in notif panel
Name the app that lists frappe as a Python dependency
Identify which app declares frappe as a Python dependency causing uv resolution failures.
Read the chromium path from launchOptions
Fix PLAYWRIGHT_CHROMIUM_EXECUTABLE_PATH environment variable being ignored.
Stop automated snapshots on Frappe Compute
Disable automated snapshots on Frappe Compute (bare metal) which fail on every run.
Copy-paste entire page or blocks
Copy and paste entire pages or individual blocks with conflict detection and dependency resolution.
Add the Atlas sidebar and dashboard
feat(desk): Add the Atlas sidebar and dashboard
Auto-boostrap pilot in cloud
Apply Central credentials during host boot, cut credential-to-serving from 833ms to 110ms, add zero-downtime site rename and admin domain updates.
Hide Central surfaces on a self-hosted bench
Hide Central-only UI elements and API calls on self-hosted benches without Central integration.
Make the iOS home screen icon full-bleed and opaque
fix(pwa): make the iOS home screen icon full-bleed and opaque
Mark fully discounted order lines as free items
fix(shopify): mark fully discounted order lines as free items
Handle out-of-sync Yarn lockfiles during app install
Retry app installation with pure-lockfile mode if frozen-lockfile fails due to lockfile drift.
Apply Central credentials during host boot
Apply Central credentials at boot time instead of waiting for first Admin request.
Thursday, September 10
Read posting date confirmation setting from boot data
Cached posting date confirmation setting in session boot to avoid extra settings lookup on every save.
Add permission checks on send_proforma_email
Proforma email send endpoint lacked permission validation.
Add email permission check on send_emails
Email send endpoints lacked permission checks, allowing unauthorized users to send emails.
Keep a dunning claimable until its interest is paid too
Dunning marked as Resolved when principal was paid without interest/fee, making interest uncollectible.
Calculate holiday list totals for half days
Half-day holidays were counted as full days; now calculated as 0.5.
Validate shelf life for automatically created expiring batches
Items with auto-batch and expiry enabled could be saved with zero shelf life, breaking inward transactions.
Reset price list fallback when changing parties
Changing customer/supplier kept old party's Price List selected if new party had no default.
Guard inventory dimension lookup without reference document
Empty Reference Document in Inventory Dimension caused server error; now guards lookup.
Use correct field when reading previous stock closing balance
Stock valuation used wrong field when reading prior period closing balance.
Set item_name to fetch if empty in packing slip item
Packing Slip overwrote custom item names from Delivery Note upon save, reverting to defaults from item master.
Handle empty bom cost allocation
Clearing Cost Allocation Per field caused TypeError during cost calculation; now normalizes empty values to zero.
Handle empty raw materials in workstation
Selecting "Transfer Materials" crashed when Job Card's Raw Materials table was empty.
Ignore disabled price lists on transactions
Disabled Price Lists persisted in boot defaults and party defaults, prefilling orders that then failed on price fetch.
Remove empty delivery stops after mapping
Fetching Delivery Notes left an empty default Delivery Stop row that prevented saving.
Stop counting received qty on non-stock invoice returns
Non-stock Purchase Invoices don't write Stock Ledger Entries, so `received_qty` validation never ran; partial returns then locked out the rest of the invoice.
% Amount Billed exceeds 100% on fully rejected Purchase Receipts
Billed % calculation used only accepted qty as denominator when rejected billing was on, inflating the percentage; now uses accepted + rejected qty.
List, ListFooter and ListBulkBar on frappe-ui's list molecule
Exports `@framework/ui/experimental/List` with presentational List, ListFooter, and ListBulkBar components on frappe-ui's list molecule.
Compose the generated list page on the list components
Generated list page now composes list controls and experimental List module instead of drawing its own table.
Page type
New page type for crafting Frappe UI screens directly on desk pages.
Fix(oauth): require client authentication on token introspection endpoint
Reverted due to breakages.
Allow list values for JSON fieldtypes in get_valid_dict
JSON field validation rejected list values in get_valid_dict.
Data import: run the import through the document's own importer
`start_import` bypassed custom `get_importer` overrides, forcing apps to fork the entire method to customize import behavior.
Move Filter, SortBy and ColumnSettings to frappe-ui's Popover slots
Updated components to use frappe-ui's new Popover API with slot-based triggers and refined placement props.
Add fade prop to TimelineContainer
Adds optional fade prop to TimelineContainer, defaults to true.
Notification panel not visible on mobile
Notification dropdown clipped by collapsed mobile sidebar; pinned it to viewport instead.
Correct the child table row form backdrop and remove duplicate button
Row form backdrop rendered near-white instead of dimmed dark; "Insert Below" appeared twice with identical functionality.
Prevent Document.get_tags from dropping the first tag
Legacy code used `[1:]` slice to strip a leading comma that modern Frappe no longer writes, accidentally removing the first tag instead.
Add partially paid status for expense claim
Expense Claims now show "Partially Paid" when partially reimbursed, differentiating from fully outstanding.
Show loan repayment in salary slip print formats
Salary Slip printed with loan repayment subtracted but never shown, making totals unreconcilable.
Handle zero payment days in payroll correction
Payroll Correction raised ZeroDivisionError on zero payment days; now shows validation message instead.
Validate salary structure for timesheet salaries
Prevents Salary Slip creation from submitted Timesheet when employee lacks valid timesheet-based Salary Structure.
Better api endpoint & perm check
API endpoint and permission improvements.
Clear editor console warnings and errors
Editor logged 8 errors and ~200 warnings from itself; marked component-valued registry items raw and fixed prop control issues.
Hide popovers and dialogs on small screens
Below 1024px the builder hides but open popovers/dialogs remained visible floating over the "Screen too small" message.
Move the color token dropdown from the picker popover to the Background field
Token dropdown on color picker popover was read-only; moved it to Background field matching Text Color's pattern.
Let users pick backup times from the dashboard
Users can now change logical backup schedule from dashboard instead of desk, avoiding working-hour slowdowns.
Show last plan change date in the change-plan dialog
Displays previous plan change date and details when user opens Change Plan dialog.
Show who archived a site, when, and why
Activity tab now visible for archived sites, showing archive actor, timestamp, and reason.
Warn about 30-day downgrade lock when upgrading to $50+ plan
Displays downgrade lock constraint right on plan selection so users confirm before upgrading.
Let teams pick their storage alert threshold
`storage_alert_threshold_percent` setting (default 90, valid 50–95) on Server and Database Server; teams can warn earlier or later than hardcoded 90%.
Change the Performance Schema notice for shared hosting
Same notice shown to all users even though Performance Schema is available only on dedicated servers; now differentiates shared vs. dedicated.
Search the servers list by name as well as title
Server search only matched title, not name; now matches both so users can find servers by either identifier.
Show the exact time when hovering a relative date
Tooltips carrying full datetime were never opening on relative time text; wrapping text in span fixed attachment.
Datum spawning and management
Datum instance spawning and lifecycle management.
Spaces-first navigation and space identity on frappe-ui beta.55
Navigation now spaces-first with spaces as first-class identity; upgraded frappe-ui from beta.25 to beta.55.
Frappe-ui: SidebarRail rename, xs–lg input scale, form typography and responsive List columns
Breaking changes for v1 RC: SidebarRail rename, input scale refactor, form typography fix, responsive List columns.
Frappe-ui: tooltip columns, reference line labels, and chart fixes
Adds `tooltipColumns` prop to BarChart, LineChart, and AreaChart for tooltip-only data; adds reference line labels and other chart refinements.
Allow ignoring files for validations
Configuration option to exclude files from validation checks.
Stable REST API
Typed REST API system with API docs, tenant ID isolation, and JWKS test server.
Add the virtual machine sleep policy
Virtual machines can now sleep when idle and wake on network packet; policy set via `is_sleepy` and `idle_timeout_seconds` flags.
Frappe-ui: export defineModel props, add ContextMenuEmits, TabButtonsSlots
Exported missing type definitions for HoverCard, KeyboardShortcutsDialog, Tree open/expanded props and ContextMenu emits.
Frappe-ui: remove duplicate update:open / update:query emit declarations
Combobox and MultiSelect declared emits twice (via defineModel and *Emits interface), causing merged signature to lose type info for consumers.
Ecommerce integrations: clear global default warehouse and fix amazon test setup
Test suite failures from item creation hitting global default warehouse company mismatch; cleared default and fixed setup.
Enforce Node.js 24 requirement in install.sh
Script silently skipped Node setup if any version existed; now validates major version and enforces Node 24.
Install.sh on Ubuntu 26.04
Installation script compatibility fix for Ubuntu 26.04.
FC-scripts: grep hooks.py for asset includes instead of using bench console
Asset include grep rewrite missed a merged PR; switched to direct grep of hooks.py like other hook finders.
Wednesday, September 9
Sum consolidated sub-assembly required quantity (v16)
Consolidation now sums both `required_qty` and `qty` fields for sub-assembly demands.
Share transfer stock across Production Plan rows (v16)
Transfer stock is now fetched once per item in stock UOM and consumed across requirements instead of being reused per batch.
Apply safety stock once across Production Plan rows (v16)
Safety stock is now counted once across requirements for the same item and warehouse before transfers and MOQ.
Apply MOQ once across Production Plan rows (v16)
Minimum Order Quantity is now applied once across related Purchase demand rows and carries purchase surplus into later Sales Orders.
Allow parent item groups in filters
Parent item groups are now available in Set Filters when users select Descendants Of, instead of being hidden by field metadata.
Carry accounting dimensions from Landed Cost Voucher
fix(stock): carry accounting dimensions from Landed Cost Voucher
Preserve rates for unsaved mapped rows
Rate-locked source rows are now resolved from the current mapped item context before child names are assigned.
Bind issue split to its own timeline
fix(support): bind issue split to its own timeline
Prevent excess process loss from inflating plan quantities
Validates cumulative finished quantity plus recorded process loss against Work Order quantity to prevent negative Production Plan commitments.
Distribute additional costs when incoming items have no value
When all incoming Stock Entry rows had zero basic amount, additional costs were not assigned; now distributes across incoming items using transfer quantity as fallback.
Account for process loss in Production Plan Work Orders
Production Plan quantity checks now account for recorded process loss on both finished-goods and sub-assembly Work Orders.
Restrict linked material requests to permitted documents
fix(buying): restrict linked material requests to permitted documents
Enforce account field allow-list on financial report filters
fix(accounts): enforce account field allow-list on financial report filters
Add permission checks to Chart of Accounts Importer methods
fix(accounts): add permission checks to Chart of Accounts Importer methods
Fill Subject and Message from Email Template
Notifications can now fetch Subject and Message from Email Templates via a new dialog.
Record hooks.py handler calls on the timeline
Hooks.py handler execution is now recorded on the timeline with hook name, app, duration, and query count.
A page frame with a pinned header row
Added PageFrame component that provides a root for generated pages with pinned headers that teleport into DesktopShell.
The customize dialog replaces the arrange drawer
The arrangement drawer becomes a CustomizeSidebarDialog mounted in the shell, opened by hash instead of overlays.
The record page's header row moves into PageFrame
Record page headers now move into the shell's pinned page frame, staying in place while the body scrolls.
Correct pointer-events property in desktop title input
Fixed typo `pointers-events` → `pointer-events` in title input CSS rule.
Dark mode issues
Fixed dark mode styling issues across multiple UI elements.
Replace menu with dropdown component
Replaced a custom menu component with the reusable dropdown component.
Export query report dates as real for excel
Query report date exports to Excel now use real date formatting instead of text.
Change dock based on doctype
The dock now changes based on the current doctype when using the awesome bar to navigate between modules.
Omit empty options from PDF link
Print view PDF links now omit empty options to avoid broken links.
Html sanitize html in email without overwriting content
Email sanitization now preserves existing content instead of overwriting it.
Keep the user on the same tab while navigating using prev / next buttons in form view
Users now stay on the same tab when scrolling between records using prev/next buttons instead of jumping to the default tab.
No access to dashboard shouldn't take the site down
fix: no access to dashboard shouldn't take the site down
Keep child table dropdowns anchored to the field when the page is scrolled
Link/Autocomplete dropdowns in child tables were positioned incorrectly; now stay anchored to the field when the page scrolls.
Add ip revalidation on every hop
Added IP revalidation on each redirect to prevent SSRF attacks and added safe-request timeout configuration.
Add Slovak language support and complete Czech translations
Added full Slovak language support and completed Czech translations with corrections for UI terminology.
Feat(quiz)!: rebuild quiz authoring around a shared question bank
Questions are now written once and reused across quizzes instead of being duplicated; a new Questions list shows every question on the site.
Carry the page through its lifecycle events
Page lifecycle events now carry page name, source (template/duplicate/blank/import), and block count for telemetry.
Render form controls in the canvas as real but inert elements, and align property control label widths
Native form controls now render as real elements in the canvas and option labels are edited inline without nesting rich-text editors.
Match globe icon styling with toolbar icons
Globe icon in the page title bar now matches the visual style of surrounding toolbar icons.
Alert on Raven when hourly backup success rate drops below 97%
Backup health is now monitored hourly with Raven alerts when success rate falls below 97%.
Preserve VMs across daemon restarts
VM PTY master file descriptors are now preserved across metald restarts using systemd's file descriptor store.
Metrics integration
Added storage metrics collection with long-term telemetry data and threshold-based event firing.
Add static VM hostname routing
Added deterministic VM routing from regional hostnames by deriving IPv6 address from tenant and VM IDs.
Use base36 in auto-proxy domains
Auto-proxy domains now use base36-encoded tenant and VM IDs instead of decimal suffixes for cleaner URLs.
Sleepy VMs + warm snapshot refactor
Added sleepy VM support with automatic snapshot-based sleeping, packet-triggered wake-up, and eBPF-tracked network activity.
Register drive domain callback before generating google auth url
fix: register drive domain callback before generating google auth url
Stabilize startup and reconnects
Aligned initial camera/microphone setup timing, preserved participant connection identity across reconnects, and fixed media lifecycle.
Serialize concurrent room creation
Concurrent first joins to the same Meet Room now share one in-flight room creation, preserving both admitted peers and avoiding orphaned routers.
Tolerate unavailable local storage
Local storage write and removal failures are now treated as best-effort so quota or browser availability failures don't interrupt Meet.
Stop the editor TOC rail squashing rows on long pages
Editor's "On this page" rail now allows flex items to grow, preventing text clipping on pages with many headings.
Tuesday, September 8
Refresh cached production plans before assertion
Fixed intermittent test failures by clearing request cache before final assertions in Production Plan tests.
Check write permission in whitelisted document methods
Added write permission checks to whitelisted document methods that mutate the document, preventing unauthorized changes.
Avoid full grid re-render per row in set_exchange_rate
Fixed performance issue where refreshing exchange rates on large Journal Entries caused full grid re-renders per row instead of per-field updates.
Use existing warehouse fixtures in Pick List tests
Fixed Pick List tests on version 15 by using standard warehouse fixtures instead of non-existent test warehouses.
Support drop-shipped items in Gross Profit report
Added support for drop-shipped items in the Gross Profit report by loading buying costs from Purchase Invoices, fixing missing cost calculations.
Share transfer stock across Production Plan rows
Fixed transfer stock being reused across all production rows instead of being shared once per item, preventing inventory overspend.
Sum required quantity when consolidating sub-assemblies
Fixed consolidated sub-assembly rows not summing required quantity, causing incorrect stock reservation for combined requirements.
Apply safety stock once across Production Plan rows
Fixed safety stock being added to every raw-material row when projected quantity was negative, now applied once across all rows.
Apply MOQ once across Production Plan rows
Fixed Minimum Order Qty being applied to each purchase row separately instead of once across combined requirements, preventing excessive purchase quantities.
Subtract billed qty for zero-amount Sales Order rows
Fixed zero-amount Sales Order rows being mapped repeatedly on every invoice due to billed quantity not being subtracted.
Fetch orders within billing allowance
Fixed Sales Invoice picker and button to show orders within global or item-level over-billing allowance, making 100%-billed orders visible again when allowed.
User not able to set valuation rate zero in stock reco
Fixed validation preventing users from setting valuation rate to zero in stock reconciliation.
UI cleanup and better statement parsing
Improved bank reconciliation UI: search scroll resets to top, date filter is more accurate, UI is more compact, and statement importer correctly detects Cr/Dr values.
Mapreduce
Added first-class MapReduce support for parallelizing long-running computationally-intensive work across smaller independent tasks.
Home COMPATIBILITY.md and port the dialog layout files
Moved COMPATIBILITY.md documentation to the main directory and ported Record Page dialog layout files to desk-v2.
Draw the record page's header row from page.header
Built record page header rendering from page.header engine, replacing page.headerActions with flat item list supporting left/right zones and client script naming.
Land the stored-script tier's tables, on Client Script and Form Layout
Added Record view to Client Script and run_order field, giving the record-page engine a home for stored scripts without a new doctype.
Dock interaction
Added new Dock and Sidebar interaction patterns for improved navigation.
Cancel linked documents in dependency order
Fixed Cancel All to process linked documents deepest-first, preventing LinkExistsError when cancelling documents still referenced by submitted docs.
Delete all linked documents in dependency order
Added "Delete All Linked Documents" dialog to recursively delete blocking documents in dependency order, resolving LinkExistsError issues.
Process large linked document sets in the background
Added background queuing for Cancel All and Delete All operations when more than 50 linked documents exist, preventing request timeouts.
The shell frame on frappe-ui's components
Built Desk v2's shell frame using frappe-ui's DesktopShell, Rail, and Sidebar components with proper scroll handling and layout.
Check every core doctype in the permitted fields test
Fixed flaky test that randomly failed when it landed on User doctype by checking all core doctypes instead.
Clear include filters and hide column picker when a print format is set
Fixed include filters leaking into the print template as a subtitle and column picker staying visible when a print format is selected.
Prepared report automation flags the reference report instead of the custom report
Fixed prepared report automation updating the wrong report, causing custom reports to never be flagged for caching.
Detect web tier concurrency without /proc
Fixed concurrent_limit detection failing on macOS by detecting gunicorn via SERVER_SOFTWARE environment variable instead of relying on /proc.
Surface progress and errors when generating report PDF
Added progress indication and error messaging for long-running PDF report generation, fixing silent failures that left users uncertain if the report was still generating.
Keep chart data when last_synced_on write conflicts
Fixed dashboard charts being lost when concurrent users generate results simultaneously and encounter write conflicts on the last_synced_on field.
Hide bulk export when user lacks export permission
Hidden bulk export action in list view for users with owner-only export permissions, while keeping it available in Data Export and report export flows.
Settle the panel's state before it is drawn
Fixed second sidebar showing randomly by settling the panel state before rendering.
Remove notification_title and notification_description
Removed separate notification title/description fields that complicated notification rendering across channels.
Added owner check before attaching doctype info to File
Added owner verification before attaching doctype information to files to prevent unauthorized access.
Scope read access to the referenced document
Decoupled comment permissions from document access, allowing apps to restrict comment visibility (e.g. internal notes on support tickets) without overriding endpoints.
Require client authentication on token introspection endpoint
Added validation layer to require client authentication on the OAuth token introspection endpoint.
Misc. oauth fixes
Removed the deprecated Resource Owner Password Credentials Grant (RFC 9700 forbids it) and added client_secret validation in the authenticate_client endpoint.
Fix(oauth)!: require verified email before logging in via social login
Hardened OAuth by fixing a boolean logic bug in email verification and normalizing verification signals across OAuth providers (Google, GitHub, Facebook, Office 365, Frappe-as-IdP). Users logging in via social login now have their email verified before account access is granted.
Deal contacts permission
Added permission check before fetching contacts for a deal.
Propagate no_of_employees to organization on lead/deal conversion
Fixed employee count field being lost or reset to default when converting leads or deals to organizations.
Agent skill for authoring workbooks over frappectl
Added agent skill enabling agents to build and edit Insights workbooks on any site with frappectl, using only a shipped contract without server-side install.
Match the import log status a finished import writes
Fixed table stats not reporting import duration by matching the correct import log status ("Completed" instead of "Success").
Keep one record per remote table when its name changes
Fixed duplicate table imports when a PostgreSQL table name changes due to schema prefix editing by resolving names to their actual tables.
Consider upgradable server for site/bench creation
Updated server selection logic to consider server upgradability in addition to health when creating sites and benches.
Include disk usage
Added root-disk utilization alerting to server health checks with a 90% threshold.
Add platform check when getting similar plans
Added platform check to plan selection logic to prevent incompatible plan recommendations.
Use region from provisioning backends
Passed region parameter during backend selection for regional services.
Ensure metadata bucket creation
Fixed metadata bucket creation to be idempotent when the bucket already exists.
Inform central on cluster health changes
Added cluster health change notifications to Central from Cargo provisioning backend.
Release machines on demand
Added on-demand machine release capability to Frappe Cargo infrastructure.
Email alerts to configured recipients
Added email as a third alert sink, allowing benches to send alerts directly to configured inbox recipients alongside webhooks and Central.
Add open-in-new-tab action and Cmd+Enter shortcut
Added "Open in new tab" option in the right-click menu and Cmd/Ctrl+Enter keyboard shortcut for Drive files and folders.
Drag threads onto a folder to move them
Added drag-and-drop to move mail threads onto sidebar folders as an alternative to the "Move to" menu.
HTTP Proxy & TLS Management
Added automated proxy server spawning, multi-IP DNS for high availability, auto-recovery/bootstrapping, automatic leader selection, and daily password rotation for Frappe Atlas infrastructure.
Save slides by client_id with conflict detection
Fixed presentation slides being wiped when two editors had the same deck open by tracking slides with client IDs and adding conflict detection.
Saving a Studio Component breaks
Fixed Studio Component save failures by serializing the block field before saving.
A PDF attachment draws on iOS
Fixed PDF attachments rendering as a black screen on iOS by configuring pdf.js worker and fixing the viewer initialization.
Every folder reaches the sidebar, not just the first twenty
Fixed mail folders beyond 20 disappearing from sidebar, folder settings, and move menus on accounts with many folders.
Keep RichTextKit demo headings out of the page TOC
Fixed demo preview headings leaking into "On this page" table of contents on documentation pages.
Check the account belongs to the caller before reading it
Added ownership checks to `get_mailboxes` and `get_quota` endpoints to prevent unauthorized access to other users' mail accounts.
Add missing loan permission checks across lending APIs
Backport of #1433 to the active branch.
Monday, September 7
Add subcontracting receipt ledger previews
Adds accounting and stock ledger previews to Subcontracting Receipt before submission without requiring data submission.
Add permission checks to whitelisted methods
fix: add permission checks to whitelisted methods
Cast non-text fields for like filters
Casts non-text columns to varchar before PostgreSQL LIKE comparisons to enable pattern matching on numeric fields.
Cast autoincrement names in joins
Casts autoincrement name columns to varchar in PostgreSQL joins to fix type comparison failures.
Support managed database ownership
Supports managed PostgreSQL root users by checking permissions before setting site roles and revoking temporary access.
Enable recorder query optimization
Enables query optimization by reading PostgreSQL index metadata and MariaDB information schema with parameterized filters.
Honor default user permissions
Falls back to User Permission defaults when stored defaults are missing or not permitted for the user.
Preserve query builder distinct ordering
Extends distinct ordering preservation to query builder with support for aliases, qualified names, and grouped queries.
Preserve valid distinct ordering
Preserves ORDER BY in distinct queries on PostgreSQL when all ordered fields appear in the result set.
Make custom button labels translatable
fix: make custom button labels translatable
Switch to prepaid credits when card is not on stripe
Handles payment failures for Razorpay UPI Autopay when token expires by switching to prepaid credits.
Allow addition of storage nodes on the fly
feat: Allow addition of storage nodes on the fly
Add as on date filter to Loan Outstanding Report
Adds historical date filtering and fixes incorrect calculations from mixing today's values with past-date queries.
Handle empty cell values in JSON and CSV exports when hide group value selected
Respects "Hide Group Amounts" filter in CSV and JSON exports, preventing raw group values from appearing in exports.
Update parent doc link field when nested Quick Edit Form
Fixes newly-created linked records from nested Quick Edit Forms not being linked back to the parent document.
Sunday, September 6
Restore hover tooltip on Profit and Loss dashboard chart
Restores hover tooltip functionality on P&L dashboard charts.
Show actual outgoing rate in ledger preview
Displays actual FIFO outgoing rates instead of average valuation rate and formats as currency in stock ledger preview.
Let an app mount its own UI inside a desk page
Enables apps to mount Vue UI with frappe-ui in shadow roots within desk pages, isolating styling and dependencies from the framework.
Constrain captured image size in camera preview
Constrains preview image dimensions in camera upload dialog to prevent overflow and stacking across grid columns.
Add disk throughput and IOPS limits
Adds disk throughput and IOPS limit controls for metal VMs.
Add support for traffic bandwith limit and ip attach/detach
Adds traffic bandwidth limits for public and private internet, cleans up egress options, and enables public IP attach/detach without VM restart.
Integrate Atlas WG Mesh
Integrates WireGuard mesh for private tenant networking, builds metald and wg-mesh binaries locally, and auto-configures machines from warm snapshots.
Add query and index analysis to the DB analyzer
Adds read-only performance analysis covering time-consuming queries, full table scans, unused indexes, and redundant indexes via Performance Schema.
Re-evaluate slot-derived computeds when a slot toggles
Fixes TextInput prefix and suffix icons rendering incorrectly when toggling visibility.
Ignore a file dropped on a read-only editor
Prevents file uploads and image insertion into read-only editors, which were incorrectly mutating document content.
Friday, September 4
Disabled marker and cost center parity in tree views
Shows disabled status as badges in Account and Cost Center tree views; makes Account Type visible in previews and adds cost center parity.
Draw a navigation item's authored icon
Renders authored navigation item icons that were defined and shipped but not drawn in the UI.
Keep the reader in the panel they are already in
When a navigation destination exists in multiple panels, keeps the reader in their current panel instead of always switching to one panel.
Open a shut section the address is standing in
Fixes sidebar section expansion so a section automatically opens when the address points to an item within it, even if keep_closed is set.
Weigh each boot key and log the ones over budget
Implements boot budget checking by logging each key's size and flagging those exceeding the 40 KB budget.
A history entry carries the sidebar it was read in
Fixes back button navigation for items that appear in multiple sidebars by storing which sidebar the page was opened in.
Typecast ref_name and docname
Updates autoincrement doctypes with correct typecasting for ref_name and docname fields.
Give parent docs identity to link child table with attach field
Fixes file attachment linking in child table fields by ensuring parent documents have proper identity.
Quote boolean literals so they work as conditions too
Quotes boolean literals in SQL conditions to fix postgres type errors when booleans are used in WHERE clauses.
Keep the right column aligned across rows
Fixes list view layout where timestamps, comment counts, and avatars had variable widths, misaligning columns.
Duplicate intro messages on first save of new document
Deduplicates intro messages that were being shown multiple times on first document save.
CSV conversion of prepared report fails when report has total row
Handles list-format total rows in CSV conversion that was expecting only dict rows.
Escape in get_csv_bytes too
Escapes special characters when exporting CSV files to prevent formatting issues with leading characters.
Translated doctype search repeats rows across pages
Fixes pagination for doctypes with translated fields, which previously repeated rows across pages due to filtering translated values in Python after SQL offset.
Set print_format_for to doctype in standard formats
Makes bundled print formats (Salary Slip variants) visible in the print dropdown by setting the print_format_for field.
Clear unused dates when Is Recurring is toggled
Clears hidden date fields in Additional Salary when toggling recurring mode to prevent false duplicate/overlap validation errors.
Write portal defaults without saving the whole document
Fixes migration failures by writing portal settings without validating broken link references in unrelated menu rows.
Use parsed GitHub url when adding app in new app dialog
Parses GitHub URLs correctly when adding apps to prevent format-related errors.
Allow a pull update on a site with a large database
Enables app pull updates on large databases (108 GB+) without requiring a full physical backup.
Standardize app page metadata
Standardizes document titles and favicons across Suite apps with dynamic, workbook-aware metadata.
Retain html formatting when pasting text content
Preserves rich text formatting (lists, inline styles) when pasting between slides instead of stripping to plain text.
Scroll table horizontally when columns exceed width
Allows horizontal scrolling of tables when added columns exceed viewport width instead of shrinking all columns.
Number card target and delta prefix
Adds optional `target` field to show target value and `deltaPrefix` for units in NumberCard; removes per-series emphasis on axis chart hovers.
QOL sidebar shortcut
Adds Cmd+B keyboard shortcut to toggle the sidebar across the app.
Storage cluster stage handling
Adds state toggles at every storage cluster stage for better recovery from failed deployment states.
Ask how far a recurring change reaches
Unifies the dialog for recurring calendar event changes (edit, drag, delete, RSVP) with consistent UI asking whether to modify one instance or the entire series.
Drive the pictures sidebar from the Theme doctype
Makes theme categories configurable via the Theme doctype with Show in Pictures Sidebar and Sidebar Order fields, eliminating hardcoded sidebar lists.
Thursday, September 3
Contribute the Default Company navigation item kind
First navigation item kind from a non-frappe app; demonstrates that extensibility is first-class with a two-file, one-hook contribution.
Ship ERPNext's module-primary rail and its module sidebars
Ships one Rail record (20 items) and 18 module Sidebar records (317 rows); ERPNext navigation arrives as JSON with no navigation code.
Skip zero quantity items in production plan material requests
Backports v16 behavior to v15: zero-quantity rows stay in Production Plan for bin reservation but are skipped when creating Material Requests.
Allow creating stock closing balances
Non-Administrator users were getting permission failures when generating Stock Closing Balance records.
Rearrange fields in BOM Operation
fix: rearrange fields in BOM Operation
Check read permission on lead in add_lead_to_prospect
The method wasn't checking whether the user could read the lead before converting it to a prospect.
Prorate landed cost charge into transaction currency
Landed cost charge GL entries were using the entire item net amount instead of the applicable charge when posting in transaction currency.
Use company-currency change amount when netting pos gl entries
Multi-currency Sales Invoices were netting POS change amount in invoice currency instead of company currency, producing incorrect GL entries.
Include payment deductions in sales/purchase register ledger bal…
Sales Register ledger view incorrectly showed discounted amounts as outstanding customer balance when payment entries posted discounts to Sales Discount accounts.
Filter cancelled BOMs in BOM Stock Analysis
The BOM selector was including submitted but now-cancelled BOMs.
Filter fully ordered items when creating RFQ from Material Request
RFQ creation was copying all items including those fully covered by POs; now filters on pending qty like the PO flow does.
Use item warehouses in production plan work orders
Work orders from a production plan were using the sub-assembly target warehouse as source for all raw materials instead of respecting each item's defaults.
Validate contact email before saving an email campaign
Email campaigns for contacts with no primary email were saving and silently failing to send; now validates email presence first.
Subtract stock qty of same-document rows from batch availability
Batch filtering was subtracting transaction-UOM qty from stock-UOM quantities, allowing assignment of batches that can't cover alternate-UOM rows.
Assign batch_no only when the first batch covers the full qty
Auto-pick was assigning a batch that couldn't fulfil the full quantity when qty spanned multiple batches; now leaves batch empty so the auto-created bundle splits it correctly.
Preserve exchange gain loss journals in lcv
Submitting a Landed Cost Voucher was cancelling the exchange gain/loss Journal Entry it was meant to work with.
Resolve desk v2 navigation into boot
New `frappe/shell/navigation.py` resolves rails and sidebars into boot, implementing the design settled by "Where does desk v2 resolve navigation layers?"
Let an app extend another app's rail, and drop mount_on
One app can now extend another app's rail while keeping its own; resolves the mounting and ordering question for multi-app navigation.
Render every navigation item kind, through the contribution door
All eight Navigation Item Type records now render in AppRail.vue instead of silently dropping seven of them; implements the contribution pathway.
Filter desk v2 navigation on the bucket each item type declares
Builds the single navigation filter designed for "Filter an authored rail"; applies the bucket each item type declares.
Draw the sidebar a linked rail item opens
Renders the sidebar panel that opens when clicking a linked rail item; implements charter point 1 of the rail/sidebar design.
Save a navigation arrangement as anchors, not positions
Desk v2's first user-state write: saves navigation arrangements (which items are pinned/hidden) as anchors rather than screen positions for consistency across devices.
Print format onboarding follow-ups
Print format builder had several follow-up fixes: unified empty-header check, restored letterhead margin in PDF, and copy-from-New-dialog fix.
Give the IMAP sync rule test account a unique email id
Test was reusing an email already owned by another test account, causing backports to v15 (where email_id is unique on its own) to fail.
Changing the file private/public should not throw FilealreadyExists error
fix(file): Changing the file private/public should not throw FilealreadyExists error
Correct typo. in cache invalidation key
User `allowed_in_mentions` changes weren't invalidating the cache because the handler checked the typo'd field name `allow_in_mentions`.
Populate footer parent_label options on page load
Footer Items' Parent Label select stayed empty on page load and only populated after editing; mirrors the fix already applied to Top Bar Items.
Open workspace by slug in Workspaces tab
Workspace routing was using raw names instead of slugs, causing lookups to miss and show 404s.
Apply the module veto to a sidebar addressed at that module
`block_modules` was gating Module items but missing Sidebar items addressed at blocked modules; now applies the veto consistently.
Force render_safe_globals context
Web pages no longer need to parse `exec_safe_globals` — `render_safe_globals` is sufficient for the use case.
Use query builder for contact search
PostgreSQL couldn't execute the Contact link query's MySQL IF function; rebuilt with the query builder to work across databases.
Read app data files as UTF-8, not the locale default
Fixes `UnicodeDecodeError` that blocked all site migrations when running under C/POSIX locales with ASCII encoding.
Dim assignee, timestamp and favourite columns for visited rows
Visited-row dimming was only applied to text columns; now extends to assignee avatar, timestamp, and favourite heart columns, plus adds data patch for existing records.
Manual backport of visited records dimming (#2693, #2767)
#2693 was never backported due to a merge commit; manually applied #2693 and #2767 to main-hotfix and fixed a subsequent migrate failure.
Add chart options API and update AddChartModal component
Moves chart definitions from hardcoded frontend to a backend API, providing an extension point for apps to contribute custom dashboard charts.
Ship CRM's rail and its four doctype sidebars
CRM's rail is now authored in source as standard rows instead of derived at runtime; implements the doctype-primary half of the navigation design.
Prevent IntegrityError when syncing items without a standard rate
Item sync was writing NULL to the NOT NULL currency column when an item had no Item Price; now coerces the rate with `flt()`.
Dedupe vue-router and dompurify for the linked @framework/ui
Building against frappe/ui source was failing because vue-router wasn't installed next to that source; added deduplication.
Find sites with outdated framework in n days
Introduces a daily audit job that snapshots the aggregate count of sites with outdated framework versions.
Warning for outdated framework version
Shows a banner in bench and site dashboards if the Frappe Framework is more than 30 days old.
Align writer and sheets navbars
Adds the shared app switcher, theme control, and account action to Writer and Sheets; aligns navbar chrome with Slides and adds editable Sheets breadcrumbs.
Atlas controller - Phase 1
Bare metal provisioning with Scaleway and Route53; adds server provider and DNS provider abstraction, HTTP proxy build, and automates wireguard + metal daemon setup.
Warm snapshots + image promotion
VM snapshots, promotion to images, and cloning from warm snapshots; refreshes VM metadata on clone.
Feat/timetable generation
Automated timetable generation for schools; administrators describe rules once and the generator builds conflict-free weeks, replicates across terms as Course Schedule records, and reports unplaceable items.
Keep the broken-file-log compensation test off stderr
Test captured stderr printing, which made CI runners look like failures even though the test passed; now redirects stderr to a StringIO.
Time edits the event modal wouldn't take
Three issues: recurring event times were overwritten on save, DST transitions weren't handled, and date validation was missing.
Delete the site's push subscriptions when a user is disabled
Disabling a user now cleans up push subscriptions on the mail server so they can't accumulate orphaned entries.
Let the account switcher keep its rows
The account submenu closed when moving the pointer toward the list; fixed by using a proper list component instead of hand-built slots.
Self-heal push subscriptions and seed missing sync state
Mail realtime wasn't working because push subscriptions were never created, only renewed; added auto-creation and sync state seeding.
Triage that reaches the end of a list keeps going
Triaging the last thread in a list closed the reading pane and deselected it; triaging from the bottom now wraps to the top to keep the flow going.
Actions that stopped at a removed toast call
Mail and Calendar actions were calling the removed `toast.removeAll()` from a frappe-ui bump; replaced with guard checks.
Restore the mobile gap above a poll in the timeline
Polls sat flush against post bodies on mobile; restored the mobile padding that was inadvertently removed.
Wednesday, September 2
Track supplier quotation order status
Supplier Quotation now tracks whether items have been ordered, reusing the status field and adding ordered_qty.
Round party balances to currency precision in Trial Balance for Party
GL balances rounded to currency precision eliminate floating-point residuals that bypassed the Exclude Zero Balance filter.
Handle BOM price list currency update
New BOMs no longer error when selecting an item triggers price list currency updates.
Ignore cancelled batch entries in valuation
Batch quantity calculations during manufacture exclude cancelled outward entries.
Add permission checks on payment entry whitelisted methods
fix: add permission checks on payment entry whitelisted methods
More improvements for the editor
Sidebar editor now supports item deletion and direct app shipping.
Author Rail and Navigation Item on desk-v2
New Rail and Navigation Item doctypes for desk v2's navigation model.
Extend Sidebar for desk v2 with an address, layers and Navigation Item rows
Desk v2's sidebar gains link_doctype, layers, and Navigation Item row support.
Better message for migrate
Framework errors during migrate now display less scary messages.
Make RQ job id creation idempotent
fix: make RQ job id creation idempotent
Use postgres-compatible quoting in SQL strings and aliases
Postgres no longer rejects double-quoted string literals and aliases; uses SQL-standard single quotes.
Cast boolean values to strings for PostgreSQL compatibility
fix: cast boolean values to strings for PostgreSQL compatibility
Use Redis heartbeat for process health
Containerized deployments now correctly detect scheduler status via Redis heartbeat instead of file locks.
Allow export when report exceeds max_report_rows
Reports over the row limit can now be exported (which the UI recommends).
Rounding inflates exactly representable values at high precision
Float rounding epsilon now scales with precision to prevent inflating exact values.
Render the doc passed by the caller
Print rendering now handles unsaved preview documents correctly via `frappe.get_print()`.
Filter User fields based on perms instead of ret. unconditionally
User fields now respect normal permission checks instead of returning all fields regardless of access.
Make `after_response` callbacks reliable
One failing callback no longer skips database cleanup; failures are logged with tracebacks.
Ignore reindexed uids when building IMAP sync rule
IMAP sync handles UIDVALIDITY changes without getting stuck on invalid sync requests.
Allowed file extensions setting not enforced for files with an unknown mimetype
File upload validation now checks extensions directly instead of relying on mimetype table lookups, preventing unintended accepts when OS/Python versions don't recognize extensions.
Allow custom values for autocomplete fields
Combobox fields now allow custom values like Frappe's Autocomplete field.
Bulk edit reports failures and supports lost reason
Bulk edit now reports which records failed to save and supports required lost reason on status changes.
Prevent 'Document not found' error flash on lead delete
Delete success is now silent instead of showing a misleading error before navigation.
Blank empty states, always-visible Update Account, false typing indicator
Settings screens (Agents, Email Accounts, Saved Replies, Field Dependencies) now render empty states instead of blank.
Strip unwanted fields from save
Dashboard forms no longer reject saves over computed fields returned by the resource read.
Apply dynamic rate limits to all public endpoints
All public meeting endpoints (join, approval, etc.) protected with configurable rate limits seeded on install.
Delete and a legible title in the event modal
Event modal gains delete from a ⋯ menu and editable title with visual affordance.
Project recorded shared stage
Record the ordered shared stage from SFU; gate FFmpeg capture on frame commits and media attachment.
Separate recorder health and admission
Recorder deployment health separate from atomic admission decisions with typed policy/capacity/recovery contracts.
Stop the delete shortcut eating Backspace
Popover isOpen state no longer swallows Backspace/Delete keypresses from the page.
Broken expresisons in custom field
fix: Broken expresisons in custom field
Give composer errors and checkbox options room to breathe
fix(polls): give composer errors and checkbox options room to breathe
Vote in a single-answer poll with radios
Single-answer polls now render radio buttons instead of checkboxes.
Table toolbar, header columns, click-to-select, wrap and auto-fit
Table toolbar unified; adds cell fill/border, text color, font selector, header controls.
Delay tooltips for two seconds
Tooltip hover delay now consistent across toolbar and teleported popovers.
Label elbow corner style and provide clear tooltips
fix: label elbow corner style and provide clear tooltips
Render fill and border on text box shapes
fix: render fill and border on text box shapes
Mirror shape rotation and connector geometry in SVG thumbnails/exports
fix: mirror shape rotation and connector geometry in SVG thumbnails/exports
Smooth laser trail spine points
Laser pointer trails eased to follow fluid gestures instead of hand jitter.
Smooth freehand stroke capture
Freehand strokes retain intended shape by filtering low-amplitude samples.
Drop the 10 MB cap on inserted images
Removed client-side image size check; limits now enforced below the app layer.
Empty-canvas nudge stays gone once a tool is armed
fix: empty-canvas nudge stays gone once a tool is armed
Show meet avatar fallback in join/leave toasts
Join/leave notifications now display themed avatar initials instead of a generic user icon.
Crash when amount paid check runs before payable amount is set
Loan repayment validation moved after payable amount is set to prevent crashes on "Validate Payments" enabled products.
A mail to yourself reads once in its thread
Self-addressed messages no longer appear twice (Sent copy and delivery copy collapsed into one).
A scroll never pages the thread
Swipe-to-page now tracks touch movement along its path instead of just endpoints, preventing accidental thread pagination during scroll.
Stop double charge debit on write off recovery payment account
Write-off recovery payments no longer double-charge the bank account when covering a charge with its own invoice.
Tuesday, September 1
Valuation method for BOM secondary items
BOM Secondary Item gets a Valuation Type select with three modes: % of FG Cost (existing), Valuation Rate (pre-v16 method: bin-average valuation), and AQ (average qty).
Production plan visualizer page and summary report fix
Fixes Production Plan Summary report (finished good rows emitted after work order rows, Order Qty showed remainder chain) and adds production plan visualizer page.
Add multi-currency support to Blanket Orders
Blanket Orders now support transaction currency, exchange rates, and selling/buying price lists with price list currency conversion.
Enhance tree view functionality for accounts and cost centers
Builds on Frappe tree redesign with accounting-specific actions: account-number badge, freeze indicator, row actions for Add Child, View Ledger, Convert, Move, Delete.
Close individual transaction items
Adds a `closed` flag on Purchase Order, Sales Order, Delivery Note and Purchase Receipt item tables to close individual rows instead of the whole document.
Skip tax addition for invoice created from opening invoice tool
Opening invoices automatically fetched taxes when enabled in Account Settings, but opening entries are inclusive and should not auto-add.
Restore isolated loyalty and subcontracting tests
Loyalty Program test module failed in isolated process; Skip-transfer Manufacture Stock Entries replaced Work Order item warehouses incorrectly.
Prevent update_doctypes from exporting files
Utility test called update_doctypes against real schema, saving standard child DocTypes to the app checkout and breaking later migrations.
Translate label in party validation
Party validation label in error messages was not wrapped for translation.
Widen item name in stock projected qty
Stock Projected Qty report allocated only 100 pixels to Item Name while Description had 200, truncating longer names.
Correct BOM sorting and stock translations
BOM item sorting used an invalid comparator for equal item codes; two stock validation messages had formatting issues preventing translation or silently discarding arguments.
Keep closed rows out of Update Items
Closed rows remained editable in Update Items dialog and reachable via the whitelisted method; server now excludes them.
Handle duplicate root BOM items
Adding the same raw material twice under a root BOM Creator raised `StopIteration` instead of a duplicate validation error.
Compare updated item quantities in stock UOM
Update Items compared quantities stored in different UOMs, rejecting valid updates or accepting invalid reductions when conversion factors differed.
Correct reservation and pick list quantities
Only the final batch had its delivered quantity updated; picked quantities spanning multiple locations were deducted repeatedly; allocated serial numbers were not removed from leftover locations.
Do not map the same row twice in "Get Items From"
Selecting the same Delivery Note twice in a Sales Invoice added two sets of lines for the same rows; button now enforces idempotence.
Explain missing fields when loading party details or taxes
When Company, party, or date was missing, the form cleared user input and showed a vague "Mandatory" message; now explains what was cleared and what must be set first.
Add permission checks on get_invoices
POS invoice endpoint was accessible without permission checks.
Add permission checks on get_available_payment_schedules
Payment schedule endpoint lacked permission validation.
Check read permission on source in create_duplicate_project
Project duplication did not verify read access to the source project.
Add missing permission validation on get_contract_template
CRM contract template endpoint was accessible without permission checks.
Validate POS Settings invoice and search fields on the server
API requests could store invalid fields or excluded items in POS Settings, bypassing browser validation.
Cleaner tree view UI
Tree view redesign with improved layout and visual hierarchy.
Add connect timeout for requests to Frappe Cloud
Frappe Cloud integration lacked timeouts, allowing network issues to block gunicorn workers indefinitely.
Log lock path on filelock timeout
Diagnostic log in `filelock()` used a plain string, logging literal `Filelock: Failed to aquire {lock_path}` instead of the actual path.
Apply field level permission on attachments in right pane
Field-level permissions were not applied to attachments in the right pane.
Make "rows selected" toast readable in dark mode
Datatable selection toast was hard to read in dark mode.
Disabled reports still appear in desk search
Disabled Reports appeared in Desk search, List View dropdowns, and recent routes when linked through Custom Roles or with no roles.
2FA login says the code was emailed when nothing was sent
`send_token_via_email` returned `True` even when `frappe.sendmail` did not queue; login page showed false success on unsubscribed or muted emails.
Don't advise deleting the lock file on lock timeout
Lock timeout message incorrectly told users to delete the file; deleting while held allows concurrent database operations.
Show print format field only for query/script reports
Print Settings dialog rendered Print Format field in doctype report view and treeview where it does not apply.
Escape docname used as default link text in get_form_link
Removes dependency on docname validation by escaping fallback link text.
Add icons for Update Progress and Mark as Completed
Goal tree row actions now display icons for Update Progress and Mark as Completed.
False Exchange Gain/Loss on Expense Claims in base currency
Expense Claims booked false gains/losses when linked advance's exchange rate was missing/zero; now skips calculation when no real rate exists.
Dim visited deals/leads in list view using frappe's _seen field
Dims deal and lead rows in list view once opened, using Frappe's built-in `_seen` tracking instead of client-side store.
Wrap hardcoded user-facing strings in __() for translation
Error banners, modal fallbacks, and validation messages on Deal/Lead pages were not wrapped for translation extraction.
Typos in user-facing messages and parameter names
Fixed intergration→integration (Exotel error), charaters→characters, seperate→separate, and extention→extension parameter.
Migrate v2 dashboards to v3 workbooks
Adds a migrator copying v2 dashboards into new v3 workbooks; v2 queries, expressions, charts and dashboards are translated, with post-migration validation comparing results.
Give the SQL column operation the same contract as develop
Migrator wrote `sql_column` field but develop reworked it to `raw_sql`, causing data loss on upgrade.
Finish the sql_column rename to raw_sql
Tests still referenced the old `sql_column` field name after rename to `raw_sql`.
Carry a SQL column expression through an ibis query
Migrator writes `sql_column` operation for v2 constructs; ensures the operation contract matches develop so columns are not lost on upgrade.
Say drop bench, not archive bench
Bench action menu was the only place that said "archive" instead of "drop" like other destructive actions.
Pre-tag surface trims, the toast contract, and the type errors that reach consumers
Eight breaking changes for 1.0.0 tag: `ThemeSwitcher` moves to experimental, DatePicker stops re-exporting utils, `Button` drops exposed `rootRef`, `HoverCard` declares side/align/portalTo, Toast compat shims removed, Toast `description` becomes required.
Multi-company India Payroll
Adds multi-company mode to Payroll Settings with a child table holding statutory registration details per company, supporting multiple ESIC employer codes and EPF establishment codes.
Pre-filled default reminders, all-day alert fixes
New events open with default reminder pre-filled as an editable row; all-day swaps respect defaults; flipping All Day swaps an untouched row between defaults.
Refactor HTTP Proxy
HTTP proxy implementation refactored with token-authenticated control endpoints for maps, certificates, health, readiness, and targeted PATCH/DELETE operations for site and custom-domain mappings.
Restrict cross-tenant access to privileged VMs
Adds controller-managed privileged VM whitelist for tenant 0, permitting cross-tenant traffic only when either endpoint is whitelisted.
Replace LVM with ZFS — snapshots, resize, restart
Storage infrastructure refactor from LVM to ZFS.
Better field mapping for actions and support for all WhatsApp languages
WhatsApp integration improvements for field mapping and language support.
Add Frappe app scaffold at repo root
Scaffolds atlas Frappe app with monorepo coding and documentation guidance.
Lay the submission details page out as a ledger
Outbox submission details redesigned as one narrow column with subject, merged delivery state, state actions, activity list, and message facts.
Make the undo send period configurable per user
User Settings gets a Compose section with `undo_send_period` select (5, 10, 20, 30 seconds, default 5).
Add shortcuts for undo send, schedule send and the outbox
Cmd/Ctrl+Shift+Enter opens Schedule Send; Cmd/Ctrl+Z undoes sent mail while server holds it.
Separate recording budgets and storage reservations
Adds explicit Drive storage reservations for recording budgets, growing them from durable cumulative segment progress.
Version recording contracts
Versions recording commands, callbacks, browser lifecycle, and Recording Grant proof seams with immutable v1 semantic vectors.
Finalize recording artifacts durably
Adds durable Frappe finalization state and authenticated status protocol for recording artifacts, making artifact validation, Drive publication and owner notifications recoverable and idempotent.
Event reminders that reach the browser
Calendar alerts now publish a realtime event to open suite tabs and become toasts with an Open action plus system notifications when permitted.
Fix Restore PF wage aggregation in EPF register
Version-16-hotfix merge into develop left `_aggregate_salary_detail` in half-merged state with undefined `company_by_slip` references, causing NameError on every call.
Give the mail actions menu its options back
Mail ⋯ menu showed "No options"; frappe-ui menu groups changed to `{ group, options }` but code still used `items` key.
Keep a selected image ring under the pinned author row
Full-width image selection ring in discussions scrolled above and was visible behind the pinned author row; now masked with z-index.
Tolerate the root-redirect race in open_root
E2E test `test_logs_into_admin` failed intermittently with navigation interruption race; added tolerance for root → /sites redirect.
Uploaded image overwrites an earlier one with the same filename
Pasted clipboard images all saved as `image.png`, with WebP versions overwriting previous images to the same URL; now generates unique names via `generate_file_name`.
Preserve active media attachments
Media element manager replaced unchanged srcObject streams after 60 seconds, interrupting playback with brief black frames on routine Vue updates.
Keep the drafts list in the doctype store
New drafts did not appear in the list and deleted drafts persisted until page reload; moved bare useCall into listStore for sync.
Monday, August 31
Work Order picks wrong Delivery Date when Sales Order has the same item in multiple rows
Backport to version-16-hotfix.
Work Order picks wrong Delivery Date when Sales Order has the same item in multiple rows
Backport to version-15-hotfix.
Use packed row delivery date
Work Orders for packed items now correctly pick delivery dates from their corresponding Sales Order rows instead of the first matching item, fixing wrong date assignments when the same item appears multiple times.
Address every doctype under every prefix, with a module segment
Moves slug table out of boot to serve per-bench routing with module-name mapping, allowing doctypes to be addressed under every prefix via a module segment.
Enforce one primary contact per party
Prevents multiple contacts from being marked as primary on the same party, eliminating ambiguity in transaction contact selection.
Private multicast network mesh
Establishes a private multicast network mesh with a reserved tenant ID for cross-IP connectivity on private networks.
Add unicast discovery relay
Adds a discovery relay for environments without multicast support, forwarding WHO_HAS and NOW_HERE messages over UDP unicast to configured peers with automatic reload and logging.
Make recording startup durable
Persists recorder startup milestones before recording begins and replays/retries startup callbacks until capture launch is acknowledged.
Recover recording interruptions
Recovers transient FFmpeg capture failures within a fixed 60-second recovery window, persisting omission bounds, callbacks, and retry state; shows participants the interrupted state and recovery countdown.
Sunday, August 30
Load available serial no report
Fixed inventory-dimension helper referencing wrong report name, which left filters undefined. Backports: [#58561](https://github.com/frappe/erpnext/pull/58561), [#58562](https://github.com/frappe/erpnext/pull/58562)
Add ConditionBuilder, a nested and/or condition editor
New UI component for building nested boolean condition trees, built on Filter's operator and value-control logic.
Calendar view breaks for users in a different timezone than the system
Converts date range explicitly: start to start-of-day, end keeps its time to avoid excluding records on the last day. Backports: [#42255](https://github.com/frappe/frappe/pull/42255), [#42256](https://github.com/frappe/frappe/pull/42256)
Litmus prepare opts the user in; matcher handles CR lines
WebDAV compliance setup now creates Drive Settings with webdav_enabled; ledger matcher handles carriage-return progress lines.
Bulk-add members with a searchable picker
Replaced single-person picker with searchable multi-select list and "add everyone" one-click for communities with hundreds of members.
Add currency details for Georgia in countryInfo.json
Added missing `currency` and `currency_name` fields; fixed `currency_symbol`.
Fix horizontal scroll, off-center page, and dynamic rescaling (ReportPrintView)
Page preview had horizontal clipping, was offset right, and scale didn't update on window resize.
Foreign currency invoices incorrectly marked as "Partly Paid" on submit
Payment status checked were comparing base currency amounts instead of invoice currency amounts.
General Ledger Ref Name filter dropdown empty & Accounting Entries navigation broken
General Ledger Ref Name filter dropdown empty & Accounting Entries navigation broken
Link field search stops working after clearing selection
Component cached database results; clearing the field didn't invalidate cache, so subsequent searches returned stale results.
German translations broken by corrupted CSV quoting
Three lines had mismatched quotes breaking RFC 4180 parser; fixed quoting to restore German translations.
SalesQuote list view shows 'Paid' status incorrectly
Switched from invoice status column (which shows payment states) to document status, and removed misleading outstanding amount column.
Force Latin digits in number formatting for all locales
Arabic locales defaulted to Arabic-Indic numbering; now forced to Latin digits globally.
Sum outstanding amounts across all references in payment validation
Multiple invoice payment validation was using assignment instead of accumulation, keeping only the last value.
Use startsWith('Sales') for party labels in print templates
Hard-coded `entryType === 'SalesInvoice'` caused non-invoice sales types to show wrong labels ("Supplier" instead of "Customer").
Saturday, August 29
Alternative finished goods conversion against work order
Work orders can now regrade/convert to alternative finished goods during QC; remains linked to original work order.
Batch split operation to produce child batches per piece
BOM Operations gain Batch Split checkbox and Weight Per Piece field to auto-create child batches per unit during production.
Erpnext sidebars and workspaces
ERPNext adopts Sidebar fixtures replacing workspace sidebars for curated navigation.
Sum item and its alternate transferred qty on work order
fix: sum item and its alternate transferred qty on work order
Persist redistributed additional costs during stock entry repost
fix: persist redistributed additional costs during stock entry repost
New creation flow
Print format creation now starts with builder as the front door; new dialog for format type selection; HTML-only report formats route to form.
Run the record-page engine's tests from the shell
Adds vitest harness to run 14 record-page unit test files from the frappe shell, closing test infrastructure gap.
Run contributed record customizations through the engine
Record-page engine accepts contributed customizations (fields, sections, buttons) and runs them against the live form.
Host the SPA shell at /apps from one bench-wide build
Central SPA shell now hosts contributed record-page customizations through a seam; one build per bench instead of per-app.
Serve apps by declared prefix under /apps
Routes apps by declared URL prefix instead of hardcoding paths, unifying app hosting policy across the framework.
Read doc and field-level permissions from the client
Adds useUserRoles and enhanced useDoctypeMeta for SPA frameworks to check permissions without boot data.
Add a way for non desk apps to go desk page of the app
feat: add a way for non desk apps to go desk page of the app
Add the missing get_current_user_roles endpoint
Record pages were failing to fetch user roles due to missing server endpoint.
Use espresso tokens in sidebar and dock
fix: use espresso tokens in sidebar and dock
Report PDF export clips columns beyond the page width
fix: report PDF export clips columns beyond the page width
Web form save fails when the form has a currency field
fix: web form save fails when the form has a currency field
Attach files linked by url to attach fields
Extends attach_files_to_document to handle http/https URLs and properly create File records on duplication.
Honour ignore_if_duplicate on a unique key violation
SQLite `bench new-site` was failing during frappe install; db_insert now honors ignore_if_duplicate flag consistently.
Email dialog ignores document's print language
Print language defaulted to system language despite document's setting; now respects guess_language() logic.
Validate group_by args before saving report
Validates `group_by` arguments against a strict whitelist before persisting report definitions.
Revalidate redirect targets in get_web_image()
fix(utils): revalidate redirect targets in get_web_image()
Escape Attach/Img./Sign./Barcode field values in print format temp.
Escapes field values to prevent XSS in print templates.
Check perm. before unzipping file
fix(file): check perm. before unzipping file
Module sidebars
HRMS navigation moves from workspace sidebars to per-module Sidebar fixtures, with nine semantic navigation-only modules.
Support custom attendance calendars
Attendance calendars now pass sorting through to queries and respect custom view status colors.
Align sidebar icon spacing with CRM and Helpdesk
fix: align sidebar icon spacing with CRM and Helpdesk
Show volume slider on lesson video player
Volume control now visible on both embedded and uploaded lesson videos.
Published status across dashboard and editor
Grid dashboard cards and editor toolbar now display publish status; heading truncation and pb-10 fixes applied.
Require JSON config values to be an object or array
fix(site-config): Require JSON config values to be an object or array
Require JSON config values to be an object or array
fix(site-config): Require JSON config values to be an object or array
Skip rate limit on all dedicated server plans
Rate limiting now correctly skipped for all nine dedicated server plans, not just two.
Add press_otp and press_otp_sent cache to persistent cache keys
fix: Add press_otp and press_otp_sent cache to persistent cache keys
Unify appearance preferences
Consolidated theme preference to User.desk_theme; removed divergent Mail, Calendar, Writer, and Meet theme implementations.
A user with no Gameplan role sees onboarding instead of a 403
SPA now correctly renders 403 errors instead of showing onboarding; permission queries fixed to check user roles before returning empty list.
Draft and declined events, and a week-aware header
Calendar events now distinguish draft (saved, unsent) from declined state; primary button adapts to Send/Save based on invitation status.
Draft and declined events, plus follow-up fixes
Adds isDraft and isDeclined flags to calendar events with dashed/struck-through rendering; fixes Tabs and related UI components.
First-class WebDAV server
Drive now runs as an RFC 4918 Class 1+2+3 WebDAV server at `/dav/`, compatible with Windows Explorer, Finder, rclone, MS Office, and mobile file managers.
Don't hardcode studio file access to System Manager, check has perm directly
fix: don't hardcode studio file access to System Manager, check has perm directly
Friday, August 28
Improve message formatting and translation for validation issues
Improves message formatting and translation for validation issues.
Preserve job card qty in mr transfer
Keeps Job Card completed quantity through Material Request mapping instead of resetting to zero via Work Order logic.
Reset bin when a repost finds no stock ledger entries
Zeros bin stock_value and valuation_rate when a repost finds no ledger entries, preventing bin totals from drifting.
Sum item and its alternate transferred qty on work order
Fixes transferred quantity calculation for items with alternates on work orders.
Set pos profile on invoices respecting user permissions
Respects user permissions when setting POS profile on invoices.
Ignore cancelled invoices in timesheet portal
Excludes cancelled Sales Invoices from timesheet portal access checks.
Translate doctype in map msg
Translates doctype names in map validation messages.
Classify MRP items without a BOM as Purchase
Sets type_of_material for items without a BOM so they appear and dispatch correctly in MRP reports.
Validate frozen accounts in period closing voucher
Restores frozen-account validation that was being skipped due to argument order in version 15.
Check quotation write permission before marking lost
Validates write permission before the `declare_enquiry_lost` endpoint modifies a Quotation.
Refactor!: allowing page_length argument for controlling amount of fetched linked items
Introduces `page_length` argument with default 0 (all linked records) for `frappe.db.get_link_options`. Breaking change.
Support none filter to avoid stricter type validation
Supports `none` filter to skip stricter type validation.
Module sidebar
Introduces module sidebars that will map 1:1 with module definitions.
Allow null filters in custom html block link query
Accepts `None` for the filters parameter in custom block link search.
Removing unusable button that appears on clicking checkbox
Removes an unusable button that appeared when clicking a grid checkbox.
Allow non-system managers to print report with print format
Allows non-System Manager users to print reports with custom print formats by skipping full Print Format read-permission checks.
Translate field labels in bulk edit dialog
Builds translated field labels from parts so the Bulk Edit dropdown shows correct language labels.
Let the v16 sidebar conversion survive real v16 data
Fixes v16 migration failure caused by bad data during sidebar conversion.
Keep a filtered sidebar item, and land on a doctype
Allows a DocType to be the first item in a sidebar.
Pin primary contact to top of Deal contacts list
Orders CRM Contacts by is_primary before idx so primary contact always appears first.
Preserve scroll position in grouped list view
Preserves scroll position when reopening a record in a grouped list view.
Kanban three-dot click — In Task Page
Fixes kanban task card menu to open dropdown without the edit modal and adds delete confirmation.
Stop an unrelated comment from cancelling a review
Moves iris review concurrency group to job level so unrelated comments don't cancel running reviews.
Run a public execution as its publisher, not with checks off
Runs public executions as their publisher instead of as Administrator with checks disabled.
Let the client reach get_site_info, and land an invitee in Insights
Changes `get_site_info` from GET-only to allow POST so frappe-ui's `call` succeeds.
Use --dev flag instead of --serve-assets for frappe runner
Uses `--dev` flag for frappe runner and installs dev extras on dev benches.
Mark fully discounted order lines as free items
Marks 100% discounted Shopify order lines as free items so ERPNext keeps the zero rate.
Keep the remembered position when leaving the tray
Stops overwriting remembered panel position when expanding out of the tray.
Integration for S3 service
Adds garage service backend for object storage with bucket creation on demand and pilot integration.
Serve site storage from a six-hourly report
Serves site storage sizes from a cached six-hourly report instead of computing inline on every request.
Add open presentation link to desk form
Adds "Open Presentation" web link on Presentation Desk form.
Size month rows to their events instead of hiding them
Month view rows grow to fit their events instead of using fixed 5–6 row grids with "n more" buttons.
Multi-day spans, a sidebar mini month, and upcoming events
Draws multi-day events across their date spans, adds a sidebar mini-month calendar, and lists upcoming events.
Let the add-app dialog accept a typed branch
Extends the add-app dialog's branch picker to accept typed custom branches.
Accept a custom frappe branch in the setup wizard
Allows typing a custom Frappe branch in the setup wizard alongside the curated list.
Encode presentation slug and fix statement terminators
Encodes presentation slug with `encodeURIComponent` and adds missing semicolons for style consistency.
Ignore xss filter for block & route fields
Ignores XSS filter for block and route fields since the framework now sanitizes JSON fields.
List every branch via one git ls-remote
Lists all branches using `git ls-remote` instead of paginated REST API, ensuring version branches like `version-16-hotfix` appear.
Open sites on their served origin and hint when the host cannot resolve
Opens sites on their actual served origin (handles http/non-default ports) and clarifies errors when the host cannot resolve.
Exclude the app-update poller from task listings server-side
Hides the `fetch-all-app-updates` poller from task listings by adding an `is_listed` flag.
Expand chat composer to four lines
Raises chat input max-height from 44px to 88px to prevent long messages from being clipped.
Reduce mobile camera workload
Requests lower-resolution, lower-frame-rate camera on mobile and uses distinct simulcast layers to reduce encoding load.
Render search palette content
Binds Mail's search content to the dynamic overlay's default slot so the desktop palette renders.
Thursday, August 27
Fix!: tax net_amount and not_applicable
Adds net_amount fields to tax rows and 'Not Applicable' marker for Item Tax Template Detail.
Fix/payment-request-subscription-plans-population
Payment Request now populated with subscription plan details when created from subscription-based invoices.
Option to skip delivery note for service items in sales order
New Selling Settings checkbox skips delivery note creation for service items (opt-in, off by default).
Filter sales and purchase analytics by entity
Adds Entity multi-select filter to Purchase and Sales Analytics.
Skip missing checkbox columns in asset type patch
Asset type migration handles v15 upgrades by checking which checkbox columns exist.
Carry accounting dimensions from Landed Cost Voucher charges
Mandatory accounting dimensions now properly carried to Taxes and Charges rows on Landed Cost.
Added missing filters for cost_center and projects
Party Ledger Summary now filters by cost center and projects.
Keep source rate on re-fetch when maintain same rate is enabled
Skips price list fetch for rows mapped from source documents when "maintain same rate" is on.
Split bank charges from exchange gain/loss on multi-currency transfers
Multi-currency transfers can now have both bank charges and exchange gain/loss on separate rows.
Resolve subscription plans for any reference doctype in Payment Request
Payment Request now resolves subscription plans for Purchase Invoice, not just Sales Invoice.
Reset hardcoded letter head on Incorrect Serial and Batch Bundle report
Removes hardcoded letterhead from report configuration.
Clarify duplicate internal party messages
Error message now identifies which existing internal party blocks creation.
Grant select on link targets to roles with write access
Grants `select` permission on link targets to roles that have `write` access.
Keep pick list links when refetching stock entry items
Preserves pick list link when user re-fetches stock entry item details.
Preserve LCV quantity across stock reconciliation
Stops filtering next Stock Reconciliation by legacy batch number, preserving LCV repricing.
Guard serial batch editor grid lookup
Prevents grid lookup errors when form validation delays table initialization.
Prevent child table doctypes as accounting dimensions
Hides child table/single doctypes from Accounting Dimension picker and blocks them server-side.
Validate serial inventory dimensions
Validates serial item availability at the inventory dimension level, not just warehouse.
Work Order picks wrong Delivery Date when Sales Order has the same item in multiple rows
Work Order now uses the correct Delivery Date when created from rows with duplicate items.
Account for pending job card qty
Excludes pending quantity from Job Card validation to allow follow-up cards.
Respect zero currency precision
When Currency Precision is set to 0, amounts now display without decimal places.
Add support to serve socketio and wsgi app through uvicorn single process
Adds support to serve socketio, wsgi, and rq in single uvicorn process.
New control "Attachment Gallery"
Adds Attachment Gallery form control for viewing, uploading, previewing, and deleting attachments.
Composer — intuitive API, host extensions, real-life stories
Composer API refactored for intuitive prop handling with host extensions support.
Add post_fixture_sync patch section for migrations
New PatchType.post_fixture_sync runs patches after fixture and customization sync.
Install mariadb client tools from ubuntu archives
Removes dependency on external mariadb repo, uses ubuntu archives for client tools.
Quote tabSingles during DocType rename
PostgreSQL now finds tabSingles with quoted identifiers during Single DocType rename.
Align the timeline gutter line with the icon axis
Timeline gutter icon now centered on line; even white space around comment/email avatar.
Handle workspace rendering
Makes workspace rendering robust against bad JSON.
Data validation as guest in web forms
Validates form data for guest users in web forms.
Key link title lookups by doctype and value
Report view now correctly resolves link titles when multiple Link columns contain same value.
Scope child item selection to filtered parents
Scopes child item selection table to filtered parents instead of leaking all parent rows.
Avoid duplicate DROP INDEX for accent/case-colliding fields during schema sync
Handles case/accent-colliding column names on MariaDB during schema sync.
Escape backslashes in filter condition values on MariaDB
Prevents backslash injection in filter condition values.
Apply parent's row-level permissions to child table queries
Enforces parent doctype's row-level permissions on child table queries.
Validate request trace ID format
Validates X-Frappe-Request-Id format before use in queries to prevent injection.
Skip reference field patch if payment_entry column is missing
fix(expense_claim): skip reference field patch if payment_entry column is missing
Read the PR thread, answer questions, review the delta
Iris review now reads PR thread, tracks settled findings, and reviews delta from prior commits.
Tighten permission and input handling
Expression context isolation, invitation key hashing, and permission boundary hardening.
Mark an email alert as one, and check its recipients at save
Validates alert recipients at save time and bounds them to site accounts.
Link chart cards to the docs
feat(dashboard): Link chart cards to the docs
Open advanced analytics by default
Advanced analytics section now open by default; toggle still available to collapse.
Allow renaming a press role
Team owners can now rename Press Roles via title field.
Add OOM kills chart to server analytics
Adds OOM Kills chart to server analytics alongside Memory chart.
Revert "fix(invoice): Set Amount due as zero once paid"
Reverts previous invoice amount due change.
Ensure dependant apps are added before the main app
Dependent apps now added before main app to resolve dependency order.
Reuse team prefix validation
Adds team prefix validation to remote file's new and restore methods.
Oversample slow queries before normalizing
Top Slow Queries chart now useful by oversampling before grouping by normalized text.
Show the job error banner without impersonation
Agent job error banner now visible to system users and support agents without impersonation.
Remove unclosed string from headers
fix(nginx): Remove unclosed string from headers
Resolve missing kwargs for get_sql
fix: resolve missing kwargs for get_sql
Enforce single participant connection
Enforces at most one active Participant Connection per participant and Meet Room.
Hide tooltips with toolbar
Toolbar button tooltips hidden when Meet auto-hides controls.
Include the meet link in the ICS LOCATION
Frappe Meet link appended to LOCATION property in generated ICS files.
Feat(Calendar)!: span multi-day events across the days they cover
Multi-day calendar events now span their full range with proper rendering for month and week views.
Refine home scheduling UI
Refines home scheduling UI with shared AM/PM options and improved avatar grouping.
Reports Redesign, billing overview and payment dialog polish
Design polish on billing console cards and dialogs; parking Payment log door for now.
Notification channel support, auto default account management
Adds notification channel support with automatic default account management.
WhatsApp notification channel + title case template enums
Adds WhatsApp as Frappe Notification channel; fixes template enum capitalization.
Manage the default whatsapp account automatically
First account added becomes default; deletion blocked while others exist.
'Allow Guest Access' option for pages
Pages can now toggle guest access; guests redirected to login if disabled.
Default a new bench to lite mode
New benches default to lite mode (single process) by default.
Add support for Garage S3
Adds S3 support for Garage object storage backend.
Integrate logs using fluent-bit
Adds `pilot setup logs` command to install fluent-bit and send logs to Datum.
Add co-host promotion in UI
Meet Room owners can now promote authenticated participants to co-host with UI action.
Join or leave a community from Settings
Settings dialog now includes entry in account menu and allows joining/leaving communities.
Page lists on the server's `has_next` signal
Drive pagination now relies on server's has_next signal instead of client row counting.
Verify full host stack before skipping packages
Full system dependency check before skipping package installation.
Merge dialog navigation and global admin access to private communities
Merge dialog navigation fixed; global admin access to private communities enabled.
Source keys from Frappe Cloud
Keys sourced from Frappe Cloud instead of hardcoded.
Return search results the caller can actually read
Drive search now filters permission before pagination instead of after.
Simplify muted toolbar buttons and pfp in chat panel
Removes filled red background from muted toolbar controls; adds participant profile images to chat.
Restore app switcher navigation
Replaces deprecated custom menu rows with native app-switcher actions.
Hide attachments from home
DocType attachments excluded from default home listing.
Restrict presence previews
Unapproved users in restricted meetings no longer receive SFU presence-preview tokens.
Ensure tmp env uses bench python version
Temporary environment uses correct bench Python version.
Fix/create sites before dns config
Creates sites directory before writing dns_multitenant config.
A dangling default_user_image link must not block every Server op
Server operations no longer fail due to dangling Atlas Settings links.
Derive ssh public key when the .pub sibling is absent
Derives public key from private key with ssh-keygen when .pub file missing.
Sync-image reconstitution must not flatten rootfs ownership
Distributed images preserve /home/frappe ownership on all hosts.
Run scheduled backups from cron and save schedules in UTC
Scheduled backups now run from cron with correct module imports and UTC schedule storage.
Curved connector's control-point drag now tracks the cursor at any zoom/pan
Curved connector control-point drag now uses correct coordinate transformation.
Selection box paints above shapes on the unified canvas
Selection chrome now renders above shapes on unified canvas.
Polygon tool icon reads as freeform, not a fixed pentagon
Changes polygon tool icon from fixed pentagon to freeform shape.
Pen/highlighter middle size dot
Evens out preview dot sizes for pen/highlighter size pickers.
Tuesday, August 25
Translate get_label results at presentation with DocType context
Field labels now translate at presentation time using the correct DocType context.
Supplier group filter not applied on accounts payable report
Report now correctly filters suppliers by selected Supplier Group.
Include time logs ending at midnight in timesheet billing summary
Logs ending exactly at midnight or crossing into the next day are now included correctly.
Render missing terms before printing
Company default Terms and Conditions now render on printed documents.
Aggregate child warehouses in Stock Qty vs Serial No Count report
Report now includes stock from child warehouses when a parent warehouse is selected.
Handle none price_list_rate in e-invoice xml generation
Prevent Jinja template errors when price_list_rate is None during Italian E-Invoice generation.
Fix/return qty validation different uom
Fix return quantity validation for items where transaction UOM differs from stock UOM in partial returns.
Hide rfq status in supplier portal
Hide submission status badge in supplier RFQ list to avoid confusion.
Hide supplier name in rfq portal
Remove redundant supplier name display in RFQ portal view.
Prevent duplicate supplier quotations from portal
Portal supplier users can now submit only one Supplier Quotation per Request for Quotation.
Grant select on link targets to roles that need them
Roles with write permission on a DocType now automatically get select on all its Link targets.
Skip link title lookup for blank Link columns in report view
Stop requesting titles for null-valued Link fields in reports.
Scroll to `role_html` field when click on Add Roles button
Dialog closes and scrolls to Roles field instead of attempting a no-op route.
Raise error with actual reason of denial
Permission error messages now show User Permission restrictions instead of generic denials.
Key release notes on pull requests, not commits
Release notes now build from pull requests instead of commits, avoiding duplication from backports.
Acknowledge /iris review, report a failed run
PR review bot now reacts to acknowledge reviews and reports failed runs.
Remove the env probes that broke CI runs
Fix CI environment variable checks and branch checkout for fork PRs in iris review bot.
Keep column names when the result is empty
Preserve column schema in cached results to prevent KeyError on zero-row filter dropdowns.
Add drag to zoom on the server and site line charts
Drag-to-zoom gesture added to 19 server and site analytics charts for easier time range selection.
Zoom the charts with a pinch on touch devices
Touch devices now pinch-to-zoom charts instead of scroll-to-zoom.
Preserve recorder integration evidence
Upgrade Suite CI actions to Node 24-compatible releases and fix artifact upload permissions.
Surface meeting info in toolbar
Meeting info popover added to toolbar showing E2EE state, fingerprint, and meeting options.
Pick the reply identity from the original message's recipients
Multi-identity reply now automatically selects the identity the message was addressed to.
Thread view cleanup
Collapsed messages now show one-line summaries instead of full headers, saving ~50% viewport space per message.
Correct service name retrieval (WRT-7)
Use full shipping service name instead of product name to distinguish between services.
Clip slideshow overflow
Slideshow root clips overflow to prevent scrollbars across different monitor viewports.
Fail recovery on snapshot errors
Snapshot errors now properly fail recovery instead of silently accepting degraded state.
Bound participant snapshot retries
Participant snapshot recovery is limited to three retries and escalates on exhaustion.
Don't keep sender copies of custom invite emails
Custom calendar invites are destroyed after sending so they don't clutter sender's mailbox.
Compare against actual writer-home route name
Error page Go Home button no longer renders on the home error page itself.
Remove orphaned temp upload file on quota rejection
Temp files from rejected uploads are now cleaned up to prevent disk leaks.
Partial Settlement overshoot no longer creates orphan principal demand
Extra principal payments in overshoot settlements are now linked to the repayment schedule.
Stop querying dropped old_name field in translate_old_name
Stop SQL errors from legacy `/drive/{file,folder,document}/` redirects on migrated sites.
Friday, August 21
Skip covered rows when ordering from the mrp report
MRP report ordering now correctly skips rows already covered.
Respect permissions in timesheet billing summary
Timesheet billing totals now exclude rows the user cannot access; includes backport 58322.
Correct to and from date filters in timesheet billing summary
Date filters in timesheet billing summary were reversed; includes backport 58318.
Stop doubling totals in timesheet billing summary
Group By was counting each entry twice, yielding incorrect totals like 21 hours instead of 10.5; includes fixes for 58315, 58318.
Changing product bundle warehouse should change packed items warehouse
Setting warehouse on a bundle item now updates warehouses in its packed items.
Fix href link webform in request data
Webform URL links on request-data page now point to correct field.
Onclick link for routes expanded
Navbar routes with onclick links were not expanding; now properly handle dynamic route expansion.
Set indicator colors on kanban columns
Job Applicant kanban columns now show indicator colors on board creation; patch backfills existing boards; includes backport 5135.
Use public scrub API in unpaid expense report
Unpaid Expense Claim report import failing on Frappe v16 fixed by using stable public API instead of internal scrub.
Improved command palette
Command palette now has functional search and keyboard navigation; most results were routing to wrong pages.
Enforce lesson completion
Per-course enforcement of lesson completion gates; students cannot open a lesson until earlier lessons are complete (opt-in, server-side validated).
AI design flow session review fixes
Attached reference images in design flow were lost after the turn they were sent; now persisted across session replay.
Match builds stay faithful to the named reference
Match builds incorrectly chose an older sibling page's design instead of the named reference geometry.
Sync the root lockfile with the workspace manifests
Yarn install failed on clean checkout due to misaligned dependency versions between root and workspace manifests.
Send component block as a string when saving
Saving an existing component threw 500 because a dict was passed to SQL instead of JSON string.
Add raven_integration app
List raven_integration on the Frappe marketplace.
Render mermaid diagrams
Published VitePress documentation now renders Mermaid code blocks as interactive fullscreen diagrams with zoom and download.
Add media fault injection coverage
Adds test coverage for SFU producer/consumer creation failures and media endpoint closure recovery.
Cover browser lifecycle recovery
Adds test coverage for deterministic browser visibility and connectivity controls in Meet media fault recovery.
Show emails in participant search
Calendar participant search now shows email addresses as primary labels with contact names and avatars as secondary.
Nested condition trees, derived workspace membership, and host-declared manager roles
Membership rules now support flexible nested condition trees instead of flat AND/OR, enabling complex workspace access policies.
Recover fresh participant connections
Converge exhausted recovery operations into one bounded coordinator; rebuild signaling and transports before advancing media health.
Recover browser media lifecycle
Suspend media repairs while hidden or offline; reset baselines and retry playback after browser transitions.
Reconcile expected media
Track expected media lifecycle state and periodically reconcile missing publications and subscriptions with bounded repairs.
Recover decoded video stalls
Distinguish missing RTP from video decode stalls using inbound frame counters; request keyframe before recovery.
Recover missing remote streams
Detect and recreate subscriptions for remote consumers missing their first RTP; retry with bounded lifecycle-safe chain.
Recover ended local tracks
Reacquire camera or microphone tracks that end unexpectedly and preserve selected-device fallback.
Video upload inconsistencies
Toolbar uploads now show progress, media lands on correct slide, and video posters render correctly on slow connections.
Show scheduled participant avatars
Preserve contact names and profile images for scheduled meeting participants.
Allow creating loan repayment directly when it fails to create during payroll
Loan repayment can now be created separately when it fails during payroll without canceling the entire payroll entry; includes backport 1400.
TabButtons options, Compose screenshot, and editor write fixes
External writes restoring earlier editor values now apply correctly; TabButtons recipe updated with theme-aware options.
Thursday, August 20
Percentage based BOM
Adds percentage-based BOM for formulations where component quantities derive from percentages that total 100%, with balance item support and automatic UOM conversion.
New docs should refetch incoming rates
New documents now refetch incoming rates before calculating cost of goods.
Preserve zero return incoming rates
Sales returns with explicit zero incoming rates now preserve that zero during rate recalculation.
Handle Transaction Deletion Record CSV edge cases
CSV import now handles short rows and imports with only skipped rows gracefully.
Use user data fields hook
Privacy rules now load correctly by replacing deprecated `user_privacy_documents` hook with `user_data_fields`.
Work order finish dialog with process loss qty from job card
Caps the job card completed qty by the minimum from previous operations and shows process loss booked.
Skip covered rows when ordering from the mrp report
Material Requirements Planning no longer tries to create orders for rows whose quantities are already covered by existing stock.
Allocate drop-ship cost by invoice quantity
Gross Profit now allocates purchase cost proportionally by invoice quantity for drop-ship items instead of assigning the full cost to every row.
Match returns to source invoice items
Gross Profit now applies returns to the correct invoice rows (not just by item code) and uses the right purchase rate for drop-ship items.
Prevent TimestampMismatchError resolving Dunning with multiple overdue installments
Payment Entries for multi-installment invoices no longer fail when the invoice appears multiple times in a Dunning's overdue table.
Scope secondary items to job card
Scrap item tracking in multi-operation work orders now limits quantities to the current job card, preventing double-booking across operations.
Support shared target UOM conversions
UOM conversions now work when both source and target UOMs convert to a common third UOM.
Fetch item stock UOM in stock reconciliation
Stock Reconciliation now shows each item's correct Stock UOM immediately, instead of falling back to settings defaults.
Preserve item UOM conversion factor
Saving an Item now keeps explicit UOM conversion factors instead of replacing them with global defaults.
Ignore future stock during batch reservation
Automatic batch reservation now uses a posting timestamp cutoff, preventing reservation of stock from future-dated entries.
Update pick list status for product bundles
Pick lists now correctly track delivery status for product bundles that spawn multiple component rows.
Escape on status image for workstations in production status
Escapes `on_status_image` in `get_workstations` so both status branches handle values consistently.
Escape interpolated values in text positions across portal and desk templates
Escapes free-text document values interpolated into element text and serializes the RFQ document safely inside its script block.
Exclude dynamic routes from sitemap.xml
Dynamic routes with placeholders (e.g. `/blog/:name`) are now skipped from sitemap to avoid invalid URLs like `/project/%3Cname%3E`.
Preserve saved page size on load more
Report page size is now reused when loading more rows instead of resetting.
RQ Job list filters and search-link crash
ID, Job Name, and Status filters now work correctly; fixed autocomplete crash on malformed job names.
Get encryption key during restore
Prevents generating a new encryption key during restore, which would fail decryption and leave the site in a broken state.
Reject non-string Web Form Request keys
Rejects list and tuple keys before they're used as ORM filters, preventing filter mismatches.
Scope reference_doc to form fields for key holders
Restricts `reference_doc` to web form fields only, preventing key holders from receiving the full document in the page.
Require only a first name to save a profile
Profile form now matches the User doctype's actual required fields (first_name only).
Skip XSS filtering on builder-authored block fields
fix(builders): skip XSS filtering on builder-authored block fields
Fix(property plus affordance recedes until interaction
Property panel plus icons now use lighter color at rest and darken on interaction.
Font token values pick from the font dropdown
Design token font values now use a searchable dropdown with per-family previews and custom font uploads instead of free-text entry.
Font dropdown keeps a minimum width
Font dropdown options list now maintains a minimum width so family names don't truncate.
Preview the selected font and design tokens in their own typeface
Font dropdown field and design token rows now preview values in their own typeface instead of the UI font.
Focus point control for cover images
Cover images now have a focal-point picker in a popover with fit tabs, live zoom slider, and preview on canvas.
Include app name in pyproject error
fix: Include app name in pyproject error
Keep whitelisted methods on the bench dropdown's group resource
fix(ui): Keep whitelisted methods on the bench dropdown's group resource
Add drilldown in cost by service report
Cost by service report now supports drilldown to see detailed breakdown.
Set Amount due as zero once paid
Invoice amount due now correctly updates to zero after payment.
Scroll the bench log dialog after the body mounts
Deep links to bench logs now scroll to the bottom on load instead of staying at the top.
Make a single command for ssh access dialog
SSH access dialog now shows a single copyable command instead of requiring multiple steps.
Shared-dep resolver so linked frappe-ui can't pull its own @tiptap
fix(scope): shared-dep resolver so linked frappe-ui can't pull its own @tiptap
Missing Popover in build config
fix(builders): missing Popover in build config
Capture build failure error and show in toast
fix(builders): capture build failure error and show in toast
Fix DOCX export and rewrite exporter
fix(writer): fix DOCX export and rewrite exporter
Correct pagination and margins in Writer PDF/print export
fix(mail): correct pagination and margins in Writer PDF/print export
Let the 500 page's links escape their iframe
fix(pages): Let the 500 page's links escape their iframe
Point the 500 page at the right docs URL
fix(pages): Point the 500 page at the right docs URL
Sign pre-commit autoupdate commits
fix(actions): sign pre-commit autoupdate commits
Raise z-index of dialog so toasts dont dim
Dialog z-index now stays above toast overlays.
Quieter resize handles, sticky text colour, and a typed font size
Resize handles now use neutral grey, sticky notes have text color control, and font size has proper typing.
Make a "+" mean an offer, and a direction change mean direction
Flowchart and mind-map connectors now show `+` only on unconnected sides and properly display decision branch directions.
All five of #544's minor issues
Eraser no longer stays armed after Clear All; Guides label hidden; toolbar triggers fixed.
Let a new object clear an arranged line, not tie with it
New objects now correctly supersede arranged lines in z-order instead of tying with them.
Distinct Lines-menu icons, and lines behave like first-class objects
Lines now show distinct geometry icons in the menu and can be selected, arranged, and deleted like other objects.
Revert "fix: Consider full year calculation for limits"
Reverts a limit calculation change that was incorrect.
DOCX import support
Writer now supports importing Word documents directly into the editor using mammoth.js for client-side parsing.
Redesign the error pages
All error pages (500, 502, 504, 429) now share one consistent layout with icon, heading, error line, and action buttons, with the 500 page linking to the bench's web error log.
Better handling of server flows
Atlas now stores and includes correlation IDs on every vm/site event for attribution of outcomes to central requests.
Make server flow robust
Server flows now have structured error handling, Resource Action tracking, and correlation IDs for matching outcomes to requests.
Add send_otp/verify_otp entry points for other apps
Telephony now exposes `send_otp` and `verify_otp` entry points for apps that verify recipients as part of their own flow.
Align the Draw home page with Drive, remove pinning
Draw home page now uses frappe-ui list primitives matching Drive's design, with sorting on column headers and no pinning.
Efficient table editing — row/column grips, structural edits, header rows, cell ranges
Whiteboard tables now support row/column grips with insert/delete actions, header row designation, and cell range selection for a Google-Docs-style editing experience.
Connectors and line improvements
Lines can now attach to shapes with auto-binding to ports or sides; connectors follow targets through move, resize, and rotate in the same undo entry.
Saving offline copies and presenting with no network
Presentations can now be saved offline with images, shell, and assets; offline mode works for viewing, presenting, and editing with sync when back online.
Clip background preview corners
Background effect corners are now clipped to prevent composited video pixels leaking through in Firefox.
Isolate participant connections
SFU media ownership is now isolated per participant connection while preserving participant identity.
Clean up closed producers
Closed media producers are now finalized idempotently and dependent consumers are cleaned up.
Recover initial media publication
Camera and microphone now retry independent publication with bounded retries and proper state tracking.
Support in/not in filters end to end
Multi-value filters now work correctly from the UI through data fetches to the Edit Data spreadsheet.
Filter out trashed files from archive downloads
Archive downloads now respect file status checks and exclude trashed files.
Images replaced on the wrong slide
Image replacements now land on the correct slide when duplicating slides from layouts.
Images pasted from another tab were not visible to viewers
Cross-presentation paste now attaches images and videos to the destination, making them visible to viewers.
Monday, August 17
Add status filter to Supplier Quotation Comparison report
Supplier Quotation Comparison report now has a Status filter (Draft, Submitted, both); defaults to Submitted to hide drafts.
Drop removed Restaurant doctype from sales tax template dashboard
Sales Taxes and Charges Template form loads properly on sites without the Hospitality app; removed reference to Restaurant DocType that was moved to a separate app.
Correct Item Group doctype name in item tax template dashboard
Item Tax Template form now loads correctly; dashboard was referencing non-existent "Item Groups" DocType instead of "Item Group".
Add missing permission check on `get_import_status`
Adds permission check to the `get_import_status` endpoint to block unauthorized calls.
Carry the reference into generation, teach the full component system
AI page generation now preserves reference layouts, fonts, components and scripts instead of losing them or rendering fallbacks.
Indent lines with tab and keep whitespace in text
Tab and Shift-Tab now indent/outdent slide text lines with 4-character stops; whitespace is preserved on reload.
Reduce interruptions for long projector presentations
Presentation mode now suppresses toasts during fullscreen and holds a wake lock to keep screen awake during long talks.
Add automatic camera framing
Automatic face-aware camera framing with stable crop tracking; users can hold and resume framing from the video preview.
Draw the laser trail as one continuous ribbon
Laser trail now renders as smooth continuous ribbon instead of beaded segments; grows from tail to head with consistent width.
Rework the shapes menu, custom polygons and shape rounding
Shapes menu reorganized into 4×2 grid with custom polygon tile (3–15 sides); shapes now support continuous rounding via corner radius slider.
Rebuild Home around the diagram list
Home now centers on the diagram list; removed yellow Drive card and Collections entirely, simplifying the interface.
Persist locked framing across sessions
Locked camera framing now persists across page reloads and future calls; restores with validation and bounds clamping.
Serve page definitions to the renderer without Studio roles
Studio page renderer now loads definitions in 1 request instead of 4, and non-studio users can now view rendered pages.
Add Trapezoid and Parallelogram shapes
Two new polygon shapes now available in the Shapes menu alongside existing presets.
Fill the block arrow's box, and make its proportions draggable
Block arrow now fills its bounding box completely; proportions of arrow head are draggable to adjust shape.
Give the eraser three modes, sized tips and Clear all
Eraser now offers three modes (Eraser with adjustable tip sizes, Erase by object, Clear all) via a dropdown menu.
Print a heatmap's categories, and stand its scale beside the plot
Heatmap categories now print formatted values on axes and in tooltips; scale displays beside the plot instead of as a separate legend.
One colour palette across the app
Unified single Espresso color palette across all menus; three near-duplicate palettes (swatches, whiteboard, components) now use the same grid.
The Lines menu is a line and an arrow for each shape
Lines menu now offers six tools: straight/elbowed/curved as both lines and arrows, with two genuinely new tools (elbowed and curved lines).
Ease camera framing back to full frame
Camera view now eases smoothly back to full frame when auto-framing winds down instead of jumping abruptly.
Make Fill read as a fill, and let the corner handle own rounding
Fill button now renders as solid disc instead of looking like a second border control; corner handle independently controls rounding.
Make the toolbar icons one weight and legible apart
Toolbar icon stroke weight and sizes now consistent across all glyphs; previously conflicting sizes made some icons hard to distinguish.
Sit the selection outline tight on the shape, and drop the edit ring
Selection outline no longer stands off shapes; edit ring removed to reduce selection chrome visual noise.
Export the preset polygon shapes as their own outlines
Block arrows, hexagons, pentagons and stars now export correctly to PNG, PDF, thumbnails and minimap; were previously rendering as plain rectangles.
Show white in the colour grid, and align the font menu with Espresso
White swatch now visible in color grid with a real outline instead of disappearing as a hairline on white; font menu now uses single Espresso palette.
Show the Arrange menu tiles as icons only
Arrange menu tiles across four sections now show icons only (tooltips carry the labels), reducing menu width from 300px and eliminating redundant text.
Group the canvas toolbar into Navigation, Creation, Editing
Toolbar now reads in three semantic sections (Navigation/zoom, Creation/insert, Editing/arrange) instead of growing contextual groups that shift everything sideways.
Drop the guide label pill and the Apps entry
Removed redundant label pill from alignment guides and unused Apps menu entry to reduce visual clutter.
Let Escape close a dialog instead of deselecting behind it
Escape key now closes Export, Share and Info dialogs instead of being consumed by the editor's keyboard handler.
Hold the export dialog at one height as the format changes
Export dialog no longer shrinks and recenters when switching between SVG/PNG formats; controls stay in place under the mouse pointer.
Size an insert menu to its tiles, not to a measured box
Lines menu width now matches its tile content instead of leaving visible empty space to the right.
Say whether a failed save needs a retry or a reload
"Save failed" message now distinguishes transient retryable failures from reload-requiring errors (e.g., frontend bundle replaced).
Scale the size preview dots instead of clamping them
Highlighter size preview dots now show three distinct sizes; middle and right options no longer rendered as identical dots due to incorrect clamping.
Type a table cell and a connector label in what they commit to
Text editors for table cells and connector labels now match the appearance of their committed output; alignment and styling were drifting while editing.
Rebuild the connector menu as one kind of control
Connector dash and corner options are now icon cells instead of word-carrying segmented controls; dash pattern is drawn at the connector's own width.
Close the selection outline by moving the handles off it
Selection outline no longer appears "open" at corners; resize handles now sit off the dashed box instead of masking it.
One drag box selects everything, and nothing it cannot act on
Marquee selection now includes whiteboard elements (ink, stickies, lines, tables) that were invisible to it; fixed two opposing filter bugs in the same function.
Render inserted images in the minimap, export and thumbnails
Images now appear in the minimap, SVG/PNG/PDF exports, saved thumbnails and home tiles; were previously rendering as empty rectangles.
No text options on the toolbar for an image
Selecting an image no longer shows text formatting controls (font, size, bold, italic, etc.) that don't apply to it.
Say why an image insert failed, and place it where the user clicks
Failed image inserts now show an error message; images place at the click point instead of a fixed location.
Let a mind map close back up when a node is deleted
Deleting a mind-map node now reflows remaining nodes back toward the parent instead of keeping the spacing of the larger tree.
Stop a mind-map node growing a line at 15 characters
Mind-map node sizing no longer oscillates between one and two lines as text grows; character-width calculation is now consistent at all font sizes.
Sunday, August 16
Correct is_frozen description on customer and supplier
Descriptions now accurately state the flag blocks all new transactions, not just ledger entries.
Validate purchase receipt exchange rate parity on purchase invoice
Foreign currency invoices at different rates silently booked exchange differences to the wrong account; now validated at submission.
Name the Page Script save event by its current spelling
Comment updated to reference `beforeSave` instead of deprecated `before_save` handler key.
`after_app_build` hook to hook into another app's build process
New hook allows apps to inject build steps when another app is built, enabling Studio to build app-specific frontends during app installation.
A per-render tab override, and announce the resolved tab
FormLayout tabs now support per-render `hidden` and `label` overrides that apply after `depends_on` resolution, and announce which tab is active to callers.
Typed empties for a new child row, and a write-through row-edit dialog
New child rows omitted fields without defaults, making `undefined * undefined` computations fail silently; dialog edits also didn't persist to parent form.
Identify tabs by name, not by position
Tab selection by index broke when `depends_on` tabs appeared or disappeared, silently moving the reader to a neighboring tab without preserving which tab they were on.
Record the source document a notification came from
Mentions in comments only recorded the parent document, not the comment itself, forcing users to search through dozens of comments to find the mention.
Report view status column corrupts link title fetch on doctypes without an indicator
Status column built unconditionally then removed mid-render, shifting all subsequent cells onto wrong columns and fetching titles for wrong doctypes.
Preserve POST authorization through login
Guest POST to authorization endpoint lost body parameters (`client_id`, `redirect_uri`, `state`) before resuming, breaking the OAuth flow.
Describe embedded components fully in reference reads
Shared headers, sidebars, and footers now described fully in reference pages, preventing Bob from rebuilding them from guesswork.
Site-aware Bob with on-demand orientation, reference reads, and online research
Bob AI agent now reads the actual site and reference pages instead of guessing, performs online research, and understands site identity and structure.
Block installing Suite when a standalone suite app is installed
Install fails with a helpful error listing conflicting standalone apps (Calendar, Drive, Mail, etc.) that must be uninstalled first.
Move standard studio app builds from `after_build` to `after_app_build` hook
Studio app builds now only run when Studio itself is built, not on every app build.
Give text elements explicit width modes
Text elements now have explicit `Auto` / `Fixed` width mode control; new text starts centered in Auto mode, and side-handle drag flips to Fixed with a single undo.
Skip recorder-dependent reconciliation when no recorder is configured
Scheduled job raised `ValueError: URL must be configured` for every pending recording on sites without a recorder, creating error logs on every run.
Send RFC 3339 date-time in HOLDUNTIL envelope parameter
Scheduled sends failed against Stalwart >= 0.16.17; HOLDUNTIL now sends RFC 3339 date-time instead of Unix timestamp per corrected RFC 4865 compliance.
Ignore stale keyframe requests
Keyframe requests from already-closed consumers were not idempotent, surfacing errors instead of silently ignoring stale work.
Synchronize camera media lifecycle
Camera media ownership changes during device switches and unmounts were not synchronized, breaking recovery and E2EE republish.
Saturday, August 15
Sync serial no status from stock ledger in Stock Qty vs Serial No Count report
Report now syncs orphaned serial numbers and corrects their warehouse/status from ledger, fixing drift caused by cancelled/amended vouchers.
Add shipping contact person to sales order, delivery note and sales invoice
Shipping contact can now be selected separately from billing contact in selling documents.
Cross-plan load and overlap validation in production plan scheduling
Production plan scheduler now loads other plans' booked capacity and validates no overlap, preventing concurrent plan slot double-booking.
Opt-in 'Consider Accounting Dimension' filter on General Ledger Report
Accounts Settings now has toggle to disable "Consider Accounting Dimension" filter on General Ledger Report, restructuring Reports tab into sections.
Belgian Charts of Accounts (commercial + non-profit, FR + NL)
Replaces placeholder chart with four validated PCMN charts from Belgian legislator, covering commercial and non-profit entities in French and Dutch.
Rewriting overdue billing checkbox description
Overdue billing field description clarified.
Rename misspelled delink_refernce_from_voucher
Internal method spelling corrected from "refernce" to "reference" for naming consistency.
Preserve alternative material attribution
Manufacturing now correctly tracks when items satisfy both their own and alternative requirement roles, preventing attribution loss.
Get items from sales order in sales invoice
Sales invoice item fetch now correctly retrieves items from linked sales order.
Filter parties by transaction company
Customer and Supplier selectors now respect company restrictions, matching Item selector behavior.
Validation for task end date check
Task end date validation now enforces proper date ordering.
Fix AttributeError on budget validation
Budget validation error message formatting now handles v15 doctype structure, showing clear validation message instead of crashing.
Allow purchase returns against closed purchase orders
Purchase returns can now be created against closed POs, removing an overly restrictive validation.
Disallow reversing a reverse journal entry
Prevent double-posting of gain/loss entries by blocking reversal of already-reversed Exchange Rate Revaluation journal entries.
Ignore historical negative batch stock in outward validation
Outward stock entries no longer blocked by negative periods from years ago that have since recovered; only current balance matters.
Honor pick serial/batch based on setting in batch selector
Add Batch Nos dialog now respects Stock Settings instead of hardcoding FIFO, allowing expiry-based batch selection when configured.
Allow scheduled jobs to override their worker queue
Cron jobs can now specify custom queue and timeout, removing workaround of enqueuing secondary jobs for longer-running tasks.
Rebuild address & contact cards and add quick entry
Address and Contact cards rebuilt with espresso components; quick entry now enabled for both doctypes on party forms.
Dispatch field commits at the mutation site
FormLayout now emits field `change` events at mutation, allowing consumers to react to field edits without deep-watching documents.
Pick RTL layout for supported languages
RTL-supporting languages now detected from framework language definitions and layout switched accordingly.
Fall back to docname when link title lookup target is missing
Report view no longer redirects when a Link column references a deleted document; displays the docname as fallback.
Apply permission checks to kanban board methods
Board read permission now enforced across all kanban board API methods.
Add permission check to assignment rule apply
Assignment rule apply method now validates caller permissions before executing rule assignments.
Consider document ownership in ToDo permission hooks
Permission checks now properly account for ToDo ownership, preventing unauthorized access to other users' tasks.
Add status filter in Monthly Attendance Sheet
Report now filters by employee status (Active, Inactive, Suspended, Left) with Active as default.
Quick action menu for assigning important masters to employee
Employee form now has "Create Assignments" menu with shortcuts to Holiday List, Leave Policy, Salary Structure, Shift and Shift Schedule.
Only notify mentions on CRM documents
CRM comment hook no longer errors on non-CRM documents like Helpdesk tickets; scope now restricted to CRM doctype references.
Add backup audit trail to site backups tab
Site backups tab now shows downloadable audit trail for past backups, querying server job logs when local records deleted by grandfather-father-son policy.
Give user an option to reactivate suspended account
Suspended users now see an account status dialog and can choose to reactivate, instead of silent auto-reactivation.
Stop remote builds on stop deploy
Stopping a deploy now cancels remote builds and fixes dockerfile syntax.
Show site list for private benches only
Benches sites tab no longer displays the massive public bench site list, reducing UI clutter.
Log integration
Datum log ingestion now supported with JWT token minting from central and verification via JWKS.
Auto send metrics by flushing buffer
Metrics now auto-flushed from buffer for timely ingestion.
Add site-scoped backup jobs endpoint
New GET /sites//backup-jobs endpoint reports Backup Site jobs with status, timings, artifact sizes, and offsite status for audit compliance.
One bake wires signup + server goldens
Chef pilot bake now registers both signup snapshot and server base image via Atlas service API in a single workflow.
Register goldens as signup/server defaults via service API
Service API can now register baked goldens as default bench snapshot for signups and default image for servers.
Run_self_serve(bake=False) for external golden
Atlas can now skip built-in golden bake and assert external service-baked golden, enabling chef-as-a-service image sourcing.
Revamp flowchart UX, node editing and connector routing
Flowchart nodes now measured by actual shape geometry, connector routing avoids passes-through, text fits shape bounds, and the + button stays in reach.
Replace Raw Styles with curated Base Styles editor
Raw Styles replaced with searchable curated CSS property editor supporting per-breakpoint edits, ported from Builder.
Add Notifications Panel to central
New notifications panel UI component added.
Table element in slides
Insert tables via drag-to-grid toolbar, resize columns without edit mode, configure headers and banding, right-click for structure operations and distribution.
Dock and minimise the composer
Mail composer now docks to bottom-right as non-modal, minimises to title bar, and remembers prior state—unblocking list/thread navigation while drafting.
Tab title, slideshow video controls and cursor
Slides now shows presentation name in tab title, hides video controls while playing, and hides cursor after idle.
Scroll selected component into view in layers panel
Layers panel now auto-scrolls to show selected block without manual panel scrolling.
Restore emoji popup background
Meet chat emoji suggestion popup now renders with correct background using current design tokens.
Relax host-key checking on ProxyJump host
Atlas builder no longer hangs on fresh containers; ProxyJump host key checking relaxed to match guest.
Drive golden CLI as pilot post-rename
Self-serve site deployments now locate pilot executable correctly after bench-cli rename.
Install openssh-client for atlas builder
Atlas builder now has SSH client to reach build VMs, enabling production image baking in docker-compose.
Wait for SSH after start() before warm_arm
Warm bake mode now waits for guest SSH readiness after boot before attempting snapshot, fixing race condition.
Keep bench-cli entrypoint for Atlas self-serve deploy
Pilot golden image now preserves bench-cli entrypoint symlink, enabling site deployments via Atlas.
Cache-bust mermaid loader in SPA
Mermaid preview no longer fails with stale oklch color format; loader asset now versioned for cache busting.
Resolve @tiptap/core from studio for exported apps
Custom TextEditor extensions in exported apps no longer fail to build; @tiptap/core now resolves from Studio's dependency tree.
Bind dialog's renamed open model
Settings dialog now opens correctly after frappe-ui's v1.0.0-beta.52 model rename.
Drive preview framework attachments
Drive previews now render framework-created attachments by normalizing MIME types and preserving WebP metadata.
Tighten chat link wrapping
Long chat URLs no longer wrap at preferred punctuation with misleading gaps; uses link-specific break-all wrapping.
Friday, August 14
Item description in the item price list
Item Description field in Item Price now displays as formatted text instead of raw HTML.
Split fifo/lifo rate across grouped stock item rows
Asset valuations with items at multiple rates now apply FIFO/LIFO correctly per row.
Apply Sales Person user permissions in Accounts Receivable
Clearing the Sales Person filter no longer bypasses user permissions for sales persons.
Describe stale exchange rate settings
Improves error messaging when exchange rate settings are out of date.
Qty and UOM not fetched when adding Item in Material Request
Python 3.14's lazy annotations were overriding type validation, breaking item detail fetching in Material Request.
Derive material transfers from actual coverage
Stock entry transfers are now capped to the quantity actually covered by included raw materials, preventing overclaims.
Delivery note billing based on quantity
Delivery notes now compute billing status on quantity basis in addition to amount basis, fixing cases where rate changes left items permanently "Partially Billed".
Keep Currency and Price List section open for foreign currency
The Currency and Price List section now starts expanded when transaction currency differs from company currency, since the exchange rate becomes relevant.
Allow purchase returns against a closed purchase order
Closing a purchase order was blocking returns for its remaining items even when receipts existed against them.
Create `crm_deal` fields on enabling frappe crm data synchronization
Creates necessary CRM data synchronization fields on Customer and Quotation when the feature is enabled, with cleanup if disabled.
Typst pdf renderer
Replaces Chromium PDF rendering with Typst for 15x faster print generation (1.5s → 90ms), consuming 300MB less memory.
Consistent link style in toast message
Links in toast messages now use consistent styling instead of being overridden by global CSS.
Limit concurrent PDF generation requests
Caps concurrent PDF renders to prevent resource exhaustion under load.
Untranslated awesomplete status messages
Awesomplete status messages ("N results found") were hardcoded in English; now route through translation via a subclass.
Untranslated quill table picker labels
Quill's table picker labels were hardcoded CSS, ignoring user language and custom translations; now render from translatable attributes.
Quick check in/out button on employee checkin doctype
Shows a quick check-in/out button on Employee Checkin list for the session employee, with optional geolocation confirmation.
Actions in saved replies
Saved replies can now bundle follow-up actions (status, priority, team, tags) that execute automatically on each use, eliminating repetitive manual steps.
Add dev-setup script for submodule init
Adds a yarn dev-setup script that initializes the frappe-ui submodule and installs dependencies in one step.
Allow updates if other app versions changed
Deployment no longer blocks when other app versions changed, preventing cascading failures.
Agent-update: Handle play failures and let servers opt out
Catches Ansible play failures and sets server status to Failure; allows servers to opt out of agent updates.
Find asset include hooks in custom apps
Adds find-asset-include-hooks.sh to list JS/CSS/icon bundles custom apps inject into page loads.
Ignore commented-out lines in hook scan
Filters commented-out hook registrations from scan results using `^[^#]*` anchoring.
Scan for request and job hooks
Adds before_request/after_request and before_job/after_job hook scanning to find-doc-save-hooks.sh.
Add the shortcuts-v1 codemod for the v1 keyboard shortcut config
Provides migration codemod to convert v0 flat-flag shortcut config to v1 combo strings.
Template library: 3 marketing templates + multi-category tagging
Adds three marketing templates (Candor, Fetch, Recipe) with multi-category tagging support.
Double-click empty canvas to type, in a box that hugs the text
Double-clicking empty canvas now creates a text box sized to fit the typed content instead of a large fixed box.
Lay the share dialog out like the one Slides and Writer share
Rebuilds share dialog to match Drive's ShareDialog layout, with unified invite field and aligned role columns.
Make the mind map a brainstorming surface
Fixes eight mind map interaction bugs: hovering affordances, draggable children, text overflow, and branch jumping.
Replace the briefcase icon with a spanner
Updates the toolbox mark from a briefcase to a spanner, drawn to match Frappe's icon geometry.
Add recipe for datum builds
Adds datum build configs with clickhouse and datum service setup.
Release tracking (pin tracked upstream repos per bake)
Adds release tracking to pin specific upstream repo commits at bake time, enabling reproducible builds.
Mint JWT for Datum Log service
Central now mints log tokens for Datum log ingestion.
Overview and Reports - show what the bill is made of
Splits billing cycle into owed and estimated amounts; adds Next payment card and Reports page.
One settings modal — desktop dialog, mobile pages
Consolidates profile, notifications, and team settings into a single SettingsDialog.
One Team page, plus the profile endpoints
Consolidates team settings and roster into one page; adds profile and password endpoints.
View and tune MariaDB variables
Adds a MariaDB variable browser and edit dialog under Settings > Database, with 51-variable catalog and 9-variable editable allowlist.
Put Duplicate in the sticky note's More menu
Moves Duplicate action to the sticky note's More menu, freeing toolbar space for frequently-used colors.
Add text case control and regroup text properties
Adds text case (As typed, Uppercase, Lowercase) control and regroups text properties into Typography, Paragraph, and Spacing sections.
Give a tool page one list of tools, not two
Removes duplicate family lists from tool pages, eliminating redundant navigation.
Remove the Weather tool
Removes Weather tool since phones already show forecasts and search engines rank weather results higher.
Give the time-zone converter its own tool, under Convert
Time-zone converter splits from World Clock as a standalone searchable tool, enabling deep links.
Remove the copy control from every result panel
Result copy buttons removed from all tools; users can select and copy as needed.
Open every tool on a worked example
Tools now open showing a realistic worked example (e.g., "100 km/h → 62.1 mph") instead of empty inputs.
Close each written section until somebody opens it
Tool pages now present written sections as closed `
Give each tool a summary that fits its row
Each tool now carries a short summary (not a full description) that fits its row in All Tools, replacing ellipsis-truncated text.
Make Settings a dialog with its own sidebar
Settings now groups preferences in a dialog with a sidebar, replacing a long single-page layout.
Firefox microphone device fallback
Media capture now retries without exact device constraints and covers Firefox's NotFoundError.
Get_template_bundle 403s on a hub with renamed token doctype
Page template loading now works on a hub with a renamed token doctype.
Unicommerce tax returns backfill
Credit note creation for RTO and customer returns now selects correct invoices, handles multi-package returns, and syncs historical returns.
Menu contrast
Danger menu items raised to red-7 for WCAG AA contrast in dark mode.
FloatingWindow z-index
FloatingWindow drops to z-40 to sit above chrome but below dialogs, fixing dialog unreachability.
Accessibility and layering
Slider now forwards aria-labelledby to the actual slider element and calls useAttrs() for aria-label support.
Settings and navigation
Tool checkboxes now have proper spacing; Reset settings now resets the tool list; page scrolling fixed.
Authorizations and owner alignment issues
Mail Cluster Store records are preserved during migration; disabled/deleted users are skipped during RSVP sync; Suite User role permissions aligned.
Multiple interaction fixes
"Offline" message now only appears when the server is unreachable; improved text selection and pin fill; fixed selection context clearing.
Fix Map Pins stacked on top left on Safari
Map pins no longer stack in the corner on Safari when navigating to the Servers page.
Show a loading skeleton instead of the empty state
Notifications page now shows a loading state while fetching instead of briefly showing "You're caught up" with an unread badge.
Load Shipment form script via doctype_js
Shipment form initialization now works correctly through the standard doctype_js mechanism.
Include unbooked and unaccrued interest in Security Deposit Adjustment payable amount
Interest accrued but not yet raised as a Loan Demand was excluded, causing legitimate adjustments to be incorrectly rejected.
Thursday, August 13
Capacity aware scheduling for production plan
Production plans now compute realistic item-wise start/end dates via finite-capacity scheduling before work orders are created.
Show full date range in MRP chart
MRP chart stopped after 10 dates and checked wrong field for past dates; now shows full range and uses correct delivery_date field.
Don't count corrective job card transfers as transferred qty
Corrective transfers were inflating material_transferred_for_manufacturing; now excluded from work order rollup.
Refine corrective job cards
Corrective job cards now require both operation fields, use Create for correct label, hide inapplicable fields, and block for semi-finished goods.
Exclude corrective transfers from item-level transferred qty
Corrective job card transfers were inflating per-item transferred quantities and understating pending demand; now excluded from rollup.
Show_search option for EmbeddedList
`EmbeddedList` now accepts `show_search` option to hide the search input for fixed-row lists.
Restore Global Search shortcut (⌘G / Ctrl+G)
Desktop Icons page was overriding the global search shortcut without page scope; now page-scoped.
Apply export field access
Export now applies field-level access control to child tables.
Update modified timestamp when Workflow Action is completed
Workflow action completion now updates the document's modified timestamp.
Handle missing json when updating a custom report
Custom reports created outside `save_report` had no `json` value, causing crashes when updating columns.
Show column indicator as colored dot, not column background
Kanban column indicator was tinting the entire column instead of appearing as a small dot in the header.
Add non-negative validation for numeric fields
HR and Payroll numeric fields (Base salary, Standard Working Hours) now reject negative values.
Remove duplicate links
Payroll workspace had 37 unique links and charts shown twice each; deduplicated.
Postgres compatible queries
HR and Payroll queries now work with Postgres.
Render Phone field in its own layout branch
Phone field now uses its own layout branch instead of overloading the default one.
Sync `builder_files` with page/script delete and rename operations
Page/script deletes and renames now sync to `builder_files` on disk; orphaned directories no longer accumulate.
Preview each font in its own typeface
Font dropdown now renders each font name in its own typeface for preview.
Add database audit logging
Enables MariaDB audit plugin from server actions; logs rotate every 2 hours, upload to S3, and are listed/downloaded via dashboard.
Consider country list present in press when trying to setup account
Signup country list now uses Press data.
Name the currency in the audit log price
Audit log storage price now displays as `2 INR` / `0.025 USD` instead of bare symbols.
Fix the audit transition jobs racing the row
Audit trail enabling no longer races against concurrent row writes; in-memory copy is now refreshed before each step.
Don't cache template list for an hour
Removed redis cache from `get_templates`; bulk query for child rows now replaces per-template get_doc.
Clean up dead ink class name and update ink-shift refusal message
Removed stale `text-ink-gray-700` class name and updated ink-shift refusal message.
Show custom page for werkzeug internal server error
App errors that bypass Frappe now show Frappe Cloud's custom error page instead of bare werkzeug/gunicorn HTML.
Trim the unified toolbar to essentials
Toolbar trimmed to core tools; undo/redo, duplicate, and whiteboard-only features removed per product calls.
Delete diagrams instantly and settle the write in the background
Bulk diagram delete is now instant; write settles in background instead of blocking the UI for ~60 seconds.
Pen/highlighter options open on tool click; both get size + opacity
Pen/eraser/sticky/line each open their own popover; pen and highlighter both carry independent size and opacity.
Upload MariaDB audit logs to S3
Rotates `server_audit` logs, reads window metadata, uploads to S3, and deletes from disk.
Add job to check and repair database tables
Adds job/API to run CHECK TABLE and auto-repair corrupted tables (REPAIR for MyISAM, OPTIMIZE for InnoDB).
Rebuild the mobile composer as a page
Mail composer is now a page-route on mobile instead of a dialog, fixing layout bounce and keyboard interaction.
Stripe-first billing: fallback rules, Amex/Diners routing, and the payment order card
Adds payment method fallback on terminal declines, Amex/Diners routing, and customer notifications on method failure.
Feature/sms email otp
Adds Twilio-backed SMS sending and OTP verification plus independent Email OTP via Frappe mail.
A rounded rectangle picks its own roundedness, and it survives an export
Rounded rectangles now pick from four corner radius presets; custom radius survives export.
A migrated flowchart routes, retypes and labels itself correctly
Migrated flowcharts now correctly route edges, retype connections, and apply label edits.
Draw freehand strokes as curves, and stop reshaping them on release
Freehand strokes now render as curves via quadratic Béziers instead of polylines, and no longer reshape when the pen is released.
Draw the Shapes tiles with Lucide icons
Shapes menu now draws tiles with Lucide icons instead of shape glyphs, matching the rest of the editor.
Move migrations to a standalone script & init resource rtracking
Migrations now run standalone before service startup; adds resource tracking endpoint with Active/Terminated/Pending status.
Serve template media in shared presentations
Shared presentations can now access media files attached to templates.
Clip the active pill's shadow to the track
Sliding pill indicator's shadow now clips to track; removes shadow bleed past rounded edges.
Regenerate the home tile thumbnail on exit, past the 30s throttle
Diagram thumbnails now regenerate on exit even if the final save lands inside the 30s throttle window.
Restore the tooltip on reaction pills
Reaction tooltip was using outdated Tooltip slot name; updated to `#content`.
Force the exit thumbnail only when the session actually saved
Forced thumbnail regeneration on exit now only happens for editable sessions, not read-only views.
Use text-ink-base on solid red in light mode
Solid red button now uses white text in light mode; dark mode unchanged.
Scale slide previews to their actual card width
Slide thumbnails in grid view now scale to their actual card width.
Use text-p tokens and add min height
Textarea used tight text scale instead of paragraph scale; added min-height to prevent collapse.
Rename the diagram title through frappe-ui, so the blue focus ring goes
Rename box was a hand-rolled input with browser focus ring on top of it; now uses frappe-ui's TextInput which handles focus styling.
Take the diagram from the form data when an image is uploaded
Image uploads broke when routed through `upload_diagram_image`; now takes the diagram from form data instead of request context.
Text overflow and selection in editor
Clicking under the multi-selection box now selects the element; text boxes wrap at slide edges; long words wrap whole without hyphenation.
Compare against the namespaced route names
Six route comparisons still tested against old bare names instead of namespaced names, keeping files openable and star badges hidden in Trash and Favourites.
Stop Recents from freezing the tab in list view
Recents passed a freshly-built grouper object on every render, causing ListView to retrigger itself infinitely; now memoizes the grouper.
Guard migration patches against sites missing legacy schemas
Migration patches crashed on sites restored from single-app backups that lacked legacy tables; now guards against missing schemas.
Center More menu rows on iOS Safari
More menu rows were vertically misaligned on older iPhones due to WebKit's anonymous inner box; added alignment fix.
Let the browser keep modified arrow keys
Tree was swallowing Alt/Cmd+Arrow and Ctrl+Home/End before checking for modifiers; now returns early when modifier keys are held.
Raise z-index above sticky ListGroup headers
Dialog backdrop and content were rendering behind sticky list headers; added z-index containment to fix layering.
Require site admin to preview files on disk
`sync_preview` had no permission check, allowing any logged-in user to retrieve full listings of staged files with paths, sizes, and MIME types.
Wednesday, August 12
Repair existing underbilled purchase receipts
New idempotent patch recomputes every candidate PO item from receipts with mixed billing; earlier patch only caught over-billed items.
Multi select item and warehouse filters in warehouse wise item balance
Item and warehouse filters now accept multiple values (MultiSelectList); compare several warehouses without re-running the report per warehouse.
Add Bank Charges account for Payment Entry deductions
New optional Bank Charges Account on Company; when a Payment Entry has a paid/received difference (e.g., bank fee), it now books to Bank Charges instead of always Exchange Gain/Loss.
Block disabled/frozen party on Opportunity and Request for Quotation
Disabled/frozen Customer could be saved as Opportunity party, only getting caught later at Quotation stage.
Correct totals and labels in section foo…
Cash flow report section totals and labels were incorrect; now match P&L and Balance Sheet filter display.
Item property updates in POS and transactions and add styling
Batch and Serial Number selection fields disappeared from POS Item Details after the item was added to cart.
Allow non-admin roles to import chart of accounts
Permission check referenced non-existent DocType "Party Account", blocking all non-admin COA imports with "Insufficient Permission".
Pass finished goods as list to subcontracting BOM lookup
Function received a `set` but only handled `str` and `list`, causing SQL query failure outside request/test contexts.
Set auto reserve stock flag before packing list generation
With `auto_reserve_stock` enabled, packed items on new Sales Orders were not marked for reserve because the flag was set after packing.
Preserve BOM Creator item details
BOM Creator item selection suppressed the inherited server method, losing item details, rates, and UOM values.
Preserve original operation idx in manually created Job Cards
Create Job Card dialog used dialog row idx instead of Work Order Operation idx, pulling raw materials from the wrong operation.
Reinstate mandatory manufactured qty check for manufacture entries
Manufacture entries could submit with For Quantity 0, leaving work order progress unupdated.
Reinstate duplicate entry check for manufacture entries
Multiple Manufacture entries against the same work order could submit when qty was already fully covered.
Reinstate operations completed check for manufacture entries
Manufacture entries could submit against work orders whose operations were never completed, bypassing the existing guard.
Validate warehouse accounts when used
Warehouse accounts were validated at build time instead of at use time, leaving incomplete configurations in drafts that would fail on submit.
Fetch driver address by supplier link
Driver form looked up transporter Address by title, failing when Supplier naming series made the Supplier ID differ from Address title; now uses Dynamic Link.
Mirror rounding adjustment on distributed_discount_amount
Rounding adjustment was added to both `net_amount` and `distributed_discount_amount` (which are linked by subtraction), double-counting the discount share.
Reset stale item details on item change
Changing an item on a Sales Order reused values from the previously selected item (UOM, conversion factor, weight, barcode); now clears them before server fetch.
Read overdue amount from payment ledger, not gl tags
With Restrict Customer Over Billing enabled, customers with advance payments allocated after invoice submit were wrongly blocked; now reads from Payment Ledger instead of stale GL tags.
Keep PO billed qty in sync when allocating amount to receipts
Amount-capped branch reduced remaining billed amount but not qty, causing later receipts to under-bill because they divided by stale qty.
Distribute PO-invoice billed amount across receipts without duplication
PO-level invoice amounts were reused across multiple Purchase Receipts during FIFO allocation, overstating billed amounts and marking receipts Completed too early.
Keep item code searchable when a barcode matches the same text
Item lookup overwrote the `name LIKE` filter with barcode condition in a dict, making item codes disappear when they overlapped a barcode.
Bill re-delivered sales order quantities
Sales Invoice used zero quantity after a full return/re-delivery cycle because `returned_qty` and `delivered_qty` were not combined correctly.
Correct nested BOM Explorer quantities
BOM Explorer reset accumulated quantity at each nested level, giving wrong component quantities; now carries multiplier through the tree and normalizes child UOMs.
Sync support for translated_doctypes in search_widget custom queries
Backports translated-doctype support from develop to v15.
Resolve currency precision from the currency's number format
Currency Precision was always read from global number format, ignoring currencies with custom decimal places (BHD, OMR, AED).
Prettier email templates
Email templates for registration, password reset, and login redesigned for clarity and visual polish.
Added setup key support in 2fa login
Two-factor authentication can now use either QR code scan or manual setup key entry for authenticator apps.
Add user/doctype filtering to `User Doctype Permissions` report
New filters let you drill into one user or one doctype instead of viewing the full matrix.
Handle None values in PortalSettings menu fields
TypeError when a PortalSettings menu field had a None value; now safely coalesces with helper method.
Index parent column on child tables
Child table `parent` column was not indexed on PostgreSQL, causing sequential scans on child-row loads and subqueries.
Index creation and modified columns like MariaDB
PostgreSQL was not indexing `creation` and `modified` columns, causing list view sorts to scan every row.
Make headless_shell executable on linux arm64
On linux arm64, `bench setup-chrome` left `chromium/headless_shell` at mode 0644, causing 300s timeout as Chromium could not start.
Migrate remaining v1 colour tokens to the v2 token set
Tailwind color utilities (`surface-white`, `outline-gray-modals`) were retired but still used, silently rendering as nothing.
Add Edit option to Notes three-dot menu
feat: add Edit option to Notes three-dot menu
Author field conditional logic in the builder + clear embedded form in place
Web Form authors can now set Visible if / Mandatory if / Read-only if per field in the builder, evaluated live on the public page (framework-style, not DocType-based).
Ticket analytics tab
New Analytics tab shows SLA adherence (deadline vs actual), where time went (by message), and issue tracking with visual deadlines.
Don't check update perms without a previous version
Creating a ticket from customer portal failed with `AttributeError: 'NoneType' object` when checking update permissions on a new document.
Reduce alert frequency to once a month
fix(2fa): Reduce alert frequency to once a month
Cancel button for long running jobs on the dashboard
Long-running jobs (restore, backup, new-from-backup) can now be cancelled from the dashboard; each leaves behind expected state (site Broken, etc.).
Spell out how to fix a blocked retry
Will-fail messages gave the problem name but not the fix; now include what failed, what's unchanged, the action to take, and the escape hatch.
Calculate flat discount on top of item discount
fix(invoice): Calculate flat discount on top of item discount
Skip Frappe version check when a branch declares none
Adding or re-pointing the frappe app crashed when validating version against a branch that declared none.
Persist inbound events before processing, dedup on event_id
Inbound Atlas events now durably persisted before handling, with unique constraint on event_id for race-safe dedup of retried deliveries.
Serve the font the offline shell already cached
Service worker precached fonts without query strings; stylesheet requested them with query params, cache miss. Service worker now matches on cache-aware key.
Give every page a heading, and the root a link to every tool
Root and data-sources pages now have proper headings and SEO; root includes links to all tools.
Say where every dataset and API comes from
New `/data-sources` page documents dataset licence, version, publish date, import date, and row counts for all bundled data.
Say who made this, and what else they make
New `/about` page explains Toolbox's mission, that tracking is disabled, links to source code and ERPNext.
Refactor(charts)!: park the old Charts family in experimental
Six old chart components (`AxisChart`, `DoughnutChart`, etc.) move from root export to `frappe-ui/experimental`; Charts v2 at `frappe-ui/charts` is now the supported family.
Upgrade echarts to v6.1.0
Echarts 6 fixes label clipping and text layout issues via improved `containLabel` and `textStyle` fallback.
Corner resize handle for images and embeds, gradient video controls
Images and embeds get a single bottom-right grip with diagonal-resize glyph; videos get gradient controls overlay.
Add the two missing Tabs breaks
Migration guide now documents `direction="right"` → `side="right"` and type export changes for Tabs 2.0.
Set bake job_timeout — arq's 300s default aborts fleet bakes
Async fleet bakes were cancelled after ~300s because WorkerSettings never set job_timeout; real builds take minutes to hours.
Image propagation from the Chef UI + CLI, and worker-backed baking
Wires image baking and fleet propagation through Chef UI and CLI, backed by Atlas's host-to-host sync API (no S3).
Expose distribute_image (host-to-host fleet sync, no S3)
New service API entry point for Chef to fan an already-promoted image to the rest of the fleet host-to-host.
Add event IDs + retry webhook event delivery
Central webhooks now carry event_id for dedup; failed deliveries retry via cron instead of dying after one attempt.
Move the end time when the start time changes
Editing event start time left end time alone, allowing invalid end-before-start; now drags end along to preserve the prior gap.
End the link when a space is typed at its end
Typing a space after a link pulled the space inside the anchor, and everything after it inherited the mark — whole sentences became accidentally linked.
Include properties when fetching EventNotification
fix: include properties when fetching EventNotification
Separate recorder deployment from SFU
Recorder was co-located with SFU; separated into standalone deployment to isolate concerns.
Avoid text clipping at the bottom
fix(meet): avoid text clipping at the bottom
Avoid false local network warnings
Local downlink warnings were triggered by reported RTP packet loss alone; now driven by confirmed consumer stalls, avoiding false positives.
Make the mobile Profile tab a page
Profile was the only tab that opened a bottom sheet instead of navigating; Settings row pointed to a page that had its own Profile row. Collapsed into a single route.
Marking a document as favourite in Writer sync to Drive's Favourites tab
Favouriting a document in Writer didn't sync to Drive, and after a partial fix it made the editor read-only until reload.
Stop deck saves from retrying deleted thumbnails
Saving a deck logged "Error Attaching File" on every save; two patches disagreed about thumbnail location, causing 404 retries.
Tuesday, August 11
Clear deferred revenue/expense fields on uncheck
Unchecking deferral left old values in the fields.
Keep asset repair downtime in sync with entered dates
Asset repair downtime only updated when status changed, not when dates were edited, leaving stale values.
Skip incoming rate calc when serial no qty is zero
Repost of serial+batch items threw ZeroDivisionError when Stock Reconciliation qty recomputed to zero.
Re-check future SLE before queuing repost on submit
Concurrent stock entries could skip repost checks because the decision was cached before writes completed.
Preserve custom title on new JV
Journal Voucher custom title was being cleared on creation.
Let apps supply their own inline SVG icons
Apps can now register custom inline SVG icons via a `Custom Icon` doctype.
Show edits, milestones and shares in the activity timeline
Activity timeline now surfaces edits (for doctypes with no version history), milestone records, and share events.
Hide core modules in global search settings
Core module doctypes appeared in the global search dropdown even though global search isn't supported for them.
Keep a document's realtime room alive while another consumer holds it
First consumer to unsubscribe from a document evicted all other watchers; now refcounts to keep the room open.
Stop a leading template comment from dropping the caller's class
Production builds silently dropped caller-supplied `class` attributes when components had a comment as the first node.
Return plain dicts and echo doc after execute_doc_method in API v2
API v2 responses were missing information available on newer versions; now returns complete payloads on both old and new versions.
Dearmor and ensure correct permissions
Wazuh key handling corrected for proper permissions.
Only update app server for unified servers
Team changes on unified servers incorrectly created new subscriptions due to missing validation.
Verify application patches
Added patch verification to prevent invalid patches from being applied.
Account for unified servers in restore space pre-check
Migration pre-check didn't account for servers where app and database share a private IP, giving false "no space" errors.
Clean chart parameters
Chart params contained stale values after page transitions.
Validate address before server creation
Missing address validation caused downstream errors during server provisioning.
Validate bench during agent job
Added bench validation before running agent jobs.
Make site update recovery resilient and recoverable
Failed site updates could end `Fatal` with no path back; recovery now handles timeouts, re-runs idempotently, and provides usable error messages on disk space issues.
Take charts v2 to the 1.0.0 bar
Charts v2 cleaned up for v1.0.0 stability; breaking changes documented in migration guide.
Serve robots.txt and a sitemap that lists every tool
Generated `robots.txt` and `sitemap.xml` that list all 34 tools for crawlers.
Give the timer, stopwatch and countdown their own routes
Timer, stopwatch and countdown split from `/timer` tab to `/timer`, `/stopwatch`, `/countdown-timer` with individual titles.
Give the PIN and IFSC lookups their own routes
PIN and IFSC code lookups split from shared tab to individual routes with dedicated SEO.
Give the four health calculators their own routes
Four health calculators (BMI, BMR, TDEE, Pace) split from shared tab to individual routes.
Give the six financial calculators their own routes
Six calculators (EMI, SIP, Compound Interest, CAGR, etc.) split from shared tab to individual routes with dedicated SEO.
Give the nine unit converters their own routes
Nine unit converters split from `/unit-converter` into `/length-converter`, `/weight-converter`, etc., with their own titles and pages.
Export is a dialog you confirm, not a menu that fires on click
Export now opens a dialog to pick format, raster scale, and see preview with pixel size before confirming.
Collections — group diagrams on Home (backend)
Added `Draw Collection` and `Draw Collection Member` doctypes for labeling diagrams.
Collections on Home — filter chips, and filing a drawing into one
Diagrams can belong to multiple collections; Home shows filter chips; clicking a chip narrows the list.
Put undo and redo on the toolbar, and make canUndo actually change
Undo/redo moved from keyboard-only to toolbar buttons; fixed `canUndo` state to actually track history.
Enforce scoped role grants (Central-side)
Team member resource grants now actually scoped per server/site, enforced through IAM.
One compact zoom control on the toolbar; the canvas is clear
Four float zoom buttons consolidated to one toolbar entry showing live percentage and a menu; frees bottom-left canvas space.
Unwrap block
Right-click > Unwrap now promotes an inner block as root or adds all children to parent, useful for replacing Studio Component wrapper divs.
One left-aligned toolbar that fits, with the four inserts promoted
Toolbar reorganized left-aligned with four insert buttons (shapes, lines, text, image) promoted to the main bar.
Send a heading and the page content to a crawler
Tool pages now send rich content to crawlers (h1, description, sections, JSON-LD) instead of running on JavaScript.
Charts v2
New chart library with Bar, Line, Area, Scatter, Donut, Funnel, Heatmap, Sankey, NumberCard; flat props naming columns as plain strings.
Write the remaining 32 tool pages
All 34 tools now have ~700-word pages with formulas, worked examples, FAQs, and JSON-LD for crawlers.
Stripe as a primary gateway
Stripe now accepted as primary payment gateway; carries cards and India e-mandates; Razorpay handles RuPay/UPI/netbanking.
Gather the synonyms of every sense into one list
Dictionary now groups all synonyms by part of speech instead of scattering them across senses.
Add recorder telemetry dashboard
Added telemetry dashboard for meeting recordings.
Lock elements in slides
Slide elements can be locked to prevent accidental moves or edits; lock/unlock from right-click menu or Cmd+Shift+L.
Add central settings
Created a doctype for general Central settings and feature flags.
Custom alerting
Users can now set up custom alerts for system metrics and site uptime with webhook notifications.
Add Anton and Courier Prime fonts
Presentations can now use Anton and Courier Prime as self-hosted `woff2` with unicode-range subsets.
Billing UI polish: invoice receipt panel, limit tiers redesign, shared list and panel infra
Invoices list now has a docked receipt panel; limit tiers show progress; overview cards have consistent anatomy.
Add SFU human-empty grace cleanup
Added grace period for cleaning up SFU rooms after all humans leave.
Grant Guardian desk access and Sales Invoice permissions
Guardians can now view student fees via Desk and Sales Invoice access wired through install and patches.
Rank recipient suggestions by correspondence
Recipient suggestions now ranked by frequency of prior correspondence, not just name match.
Collapsible sections in editor
Added toggle sections to the rich and comment editors via `/` menu, toolbar button, or `>>` shorthand.
Composed Tabs family, TabButtons parity
Tabs rewritten as a composed family (TabList / TabTrigger / TabPanel) with trigger-value model and RouterLink support.
Upgrade Boat button in the Desk UI
Operators can now roll boat generation (binary, sudoers, units) fully from the Desk UI with verification and daemon-stayed-up checks.
Host-to-host local-image distribution over HTTP (no S3) + Sync Across Hosts
Promoted snapshot images can now be circulated across the fleet over on-host HTTP without an object store, plus a "Sync Across Hosts" Desk action.
Guard legacy screening patches against missing account_id
Migrate failed on sites that hadn't yet migrated legacy screening doctypes (which were deleted).
Write Outgoing settings to Account Settings after model sync
Migrate failed because a patch tried to write columns that didn't exist yet (created by model sync).
Draw the Shapes menu with the shapes icon, not a lone square
Shapes menu button showed a rectangle icon (the first shape) instead of the category icon.
Pinning belongs to Home, so drop it from the editor's menu
Editor ignored the five-pin Home limit, letting users pin unlimited diagrams from inside.
Print the canvas exactly, with no added whitespace
Print added a white band below the diagram when the page ratio didn't match canvas ratio.
Stop pointing users at the palette that is gone
Onboarding copy pointed at a toolbar palette that was removed.
The minimap draws the diagram, not an approximation of it
Minimap rendered whiteboard objects as grey boxes instead of their actual content (ink, highlighter, tables).
Let a diagram's owner change and revoke the access they granted
Changing a collaborator's level or revoking access failed for non-admins on all but the first share.
Use room ID as fallback name for recording files
Recording files now use room ID as fallback when title is unavailable.
Imperative dialogs and toasts don't work in dev mode
Dialogs and toasts fired imperatively didn't show in dev; excluded frappe-ui from optimizeDeps to dedupe state.
Recorder speaker sync
Fixed speaker synchronization issues in call recording.
Hold the dataset import lock until the rows are committed
Dataset import lock was released before rows committed, allowing concurrent imports to corrupt each other.
Keep the timer workspace for the browser session, not forever
Timer, stopwatch and countdown persisted to `localStorage` across browser sessions instead of clearing.
Keep the calculator and dictionary histories for the session
Calculator and dictionary histories persisted to `localStorage` forever instead of for the session only.
Show the forecast in the unit the visitor chose
Temperature unit setting was ignored; weather always showed Celsius regardless of choice.
Share the body measurements calculators claim to share
Four health calculators promised to share body measurements but didn't; now they actually do.
Stop legacy /g/ URLs from landing on 404
Old `/g/teams` links (from when the app lived at `/teams`) redirected to 404 instead of the community page.
Remove transition flashbang when theme switching
Theme switches caused a visual flash because transitions remained active; now temporarily disabled during switch.
Stale responses no longer write docStore/listStore
Concurrent writes could leave the stores with stale data from the response that settled last, not the newest one.
Flaky undo-delete and 403 on shared presentation media
Undo could lose slides; media access checked a random File row instead of the presentation's actual files.
Show replies that land in already-loaded threads
Incoming replies to already-visible threads were silently dropped; now updates the thread in place and re-sorts.
Rank recipient suggestions by relevance
Recipient search returned unscored results ordered by insertion instead of match quality; now ranks by relevance and correspondence frequency.
Render ToastProvider before the slot so early toasts land
Toasts fired during app setup were dropped because the provider hadn't subscribed yet; reordered to catch early toasts.
Keep adjacent lists merged so numbering continues
Deleting an item and its empty line split an ordered list, restarting numbering at 1 instead of continuing.
Harden recording ingestion and recorder reliability
Improved recording robustness and validation during ingestion.
Keep the dialog stack on one instance across package copies
`dialog.confirm()` rendered nothing in dev because esbuild pre-bundling created separate instances of the package, splitting the dialog stack.
Grant lvremove of regular snapshot LVs in sudoers
Terminating a VM with a snapshot failed because the sudoers allowlist only covered migrate snapshots, not regular ones.
Sudo the image presence probe for 0700 directory
Image presence check failed on synced hosts because the boat user cannot stat a 0700 root directory.
Bring up boat's HTTP listener and ANCP units at bootstrap
Freshly bootstrapped hosts came up with wg-mesh DOWN; the systemd units were never enabled or started during bootstrap.
Virtual machine stop must wait past boat's graceful drain
VM stop timeout (30s) was shorter than the graceful shutdown it waited for, causing stale `Running` status even though the VM actually stopped.
Bootstrap sets the server Active on success
Server bootstrap completed but never transitioned to `Active` status, leaving the documented adopt→Bootstrap→Active flow broken.
Check upload on the parent instead of granting create
Drive's generic API was granting `create` unconditionally, bypassing the parent `upload` check that Drive's own endpoints enforce.
Monday, August 10
Validate webform for project
Web form permission validation now includes project context.
Reflect in-invoice receivable credits in Sales Register ledger view
Ledger did not reflect in-invoice receivable credit entries.
Tolerate floating-point drift in sales team allocated percentage
Sales team allocations rejected valid allocations whose sum drifted due to float precision.
Negate stock value difference for outward transfer bundles
Outward stock value multiplied by itself instead of by −1; silently wrong until recalculation from qty.
Rename Italy's duplicate Customer name fields
Italy regional setup created custom first_name/last_name fields colliding with standard quick-entry fields added in #46281, breaking all subsequent custom fields on Customer.
Handling negative grand total
Sales Orders and Purchase Orders now allow negative totals when the negative-rate setting is enabled; validates rate and keeps quantities non-negative.
Escape `customer_details` on lead creation from appointment
Unescaped customer_details field on appointment-to-lead creation could inject script.
Sync open reference forms after Quality Inspection submit
QI updates references via raw db writes without emitting realtime events, leaving open forms stale. Now calls notify_update so browsers stay in sync.
One search-and-select field with a real combobox
Three tools (World Clock, Weather, Dictionary) had near-identical search fields with accessibility bugs; unified into one real combobox.
Serve Toolbox at the site root
Tools now at frappe.tools/calculator (not /toolbox/calculator); root itself is All Tools. Rebase required Frappe router integration.
Audio Recorder: capture in the browser, save to the visitor's device
Recordings no longer stored on server (removes last owner-private records). Browser captures with 10-minute/100 MB limit, saves to device.
Remove the authentication layer: no accounts, no stored user data
Toolbox now free public website with no accounts, no user records. DocTypes drop 22→5 (read-only reference data), backend LOC ~2,300.
Remove the eight tools cut in the account-free pivot
Registry drops 23→15 tools. Expenses, Library, Reminders, Checklists, Notes (account-only) and Tone Generator, Metronome, Audio Inspector (focus) removed.
Find a city by the name it is known by locally
GeoNames names places in most-common language, so "München" and "Roma" had no matches. Search now uses alternate names column.
Move Weather off Open-Meteo to MET Norway and a bundled city dataset
Open-Meteo free tier is non-commercial only; moved to MET Norway CC BY 4.0 data and bundled city dataset, unblocking auth removal.
Render per-route page metadata on the server
Each tool route now sends unique title, description, and structured data so crawlers and search engines know Weather and Calculator are different pages.
Live "On this page" TOC beside the editor
"On this page" outline built from live ProseMirror doc beside editor; scrolls to headings on click. Collapses to reader strip on mobile.
Editing nested fragments (dialogs inside dialog, dialogs inside studio component)
Nested overlays now show in breadcrumbs for easy navigation. Can now click overlay components on canvas to edit them.
Add rate limits
Calendar event creation/edit mails invites to participants; new rate limits prevent fan-out abuse like outbound.send.
Park the v0 TextEditor family in frappe-ui/experimental
Deprecated TextEditor moved to experimental for apps mid-migration; v0 imports redirected.
Feat(Alert)!: redesign for espresso 2.0, add SidebarCard
Alert redesigned content-driven with theme colours; SidebarCard split out as new sidebar promo card.
Per-cell bold, italic and underline in whiteboard tables
Formatting applies to selected cell text or shift-clicked range. Model lives in cellRuns alongside plain-text cells.
Drop the type glyph from Home's list rows
Type glyphs were neutral and only pushed titles right; row and header glyphs both removed.
Icon-only Export and Share in the editor top bar
Export and Share now ghost icon buttons like Comments and the menu, one consistent row.
Drop Rename from the "..." menu, and name the pin action Pin
Removed Rename (redundant with clickable title), renamed Favourite/Unpin to Pin with real pin icon.
Flat, Frappe-Drive-style Home list with sortable headers
De-carded rows, flat table with hairline separators, hover and selected fill, sortable headers. QA'd live.
Canvas toolbar frame and one selection resolver
Static toolbar below title bar as frame for moving all eight floating menus. Nothing moves yet, all bars work as before.
Move the block selection's controls onto the canvas toolbar
22 controls from floating block editor become toolbar groups; makes toolbar real for default document type.
Move the whiteboard controls onto the canvas toolbar
Three floating toolbars (selection editor, sticky note, table cell) moved to canvas toolbar.
Move the mind-map and flowchart controls onto the canvas toolbar
Four floating bars folded into toolbar; bottom palette's map-wide actions consolidated.
Split the insert palette onto the canvas toolbar
Bottom palette gone, five categories split into toolbar entries. Canvas is clear of floating chrome.
Mind-map node redesign — monochrome look, Espresso colour, hover/selection, text menu
Nodes default to uniform gray box; colour is opt-in via Espresso swatch grid. Hover and selection consistent, no rotation, text-only formatting menu.
Tune rate limits and cover missing endpoints
Rate limits were too tight for normal signup flow; adjusted and added missing endpoint coverage.
Handle missing entity_name in get_entity_with_permissions
Missing entity_name parameter raised TypeError 500 before error handling; now optional with graceful fallback.
Purge versions when a document is deleted
Drive's `clear_deleted_files` failed on Writer files because Writer Version links to deleted Writer Document; now purges versions on delete.
Recording indicator sync with non hosts
Recording indicator did not sync across non-host participants.
Prevent flash while switching theme
Theme swap strobe — every transitioning element landed at different times. Suppress transitions during swap.
Read the theme from the key the store writes it to
Theme resolver read from old localStorage key after migration; dark mode preference was lost.
Name the tempo slider, drop dead slider attributes, use Badge amber
Slider never bound $attrs, so class and aria-label reached no element; seven sliders carried dead labels.
Stop Button label from silencing the descriptive aria-label
Button label prop overwrote aria-label; 38 calculator keys lost descriptive names (√x announced as "√x" instead of "Square root").
Bind slider values as arrays so they stop pinning to the minimum
All seven sliders bound scalars instead of arrays, pinning thumbs to minimum (120 BPM read as 30, 50% volume as 0).
Finish #303 — tokenize pin star, Divider separators, off-scale text
Pin star tokenized, separators converted to ``, off-scale text normalized.
Normalise off-scale text, dead borders, raw status colours to tokens
Off-scale `text-[Npx]`, dead `border-black/10`, and raw status colours across 28 files replaced with frappe-ui tokens.
Remember the Home layout, and recover from a dead thumbnail
Home tile/list choice was not persisted; now survives reload. Dead thumbnail recovery added.
Give JPEG its own icon in the export menu
PNG and JPEG both drew the same icon; JPEG now uses file-image for clarity.
Drop Home's end-of-list marker, word each empty view for its tab
Unhelpful end-of-list marker ("reached the end") dropped; empty states now tailored per tab with actionable messaging.
Let double-click open a table cell again
Double-clicking a whiteboard table cell selected the table instead of opening it for edit; selection change cleared editingCell.
Make the sticky note's floating toolbar render again
Toolbar was a Teleport from an SVG `
Emit oklch from sync-tokens
sync-tokens regenerated colors.json in hex, reverting manual oklch conversion; now includes hex-to-oklch converter.
Fix(useCall)!: a throwing beforeSubmit cancels the submit
beforeSubmit throw was caught and logged without surfacing, request sent anyway. Now properly cancels submit and rejects.
Dedup host across sibling mounts
Inject guard in Dialogs.vue only saw ancestors, so sibling provider and slot content hosts both mounted and rendered dialogs twice.
Friday, August 7
Split exchange gain and exchange loss accounts
Adds Exchange Gain Account and Exchange Loss Account to Company so realized FX gain/loss books to separate accounts instead of one combined.
Drop call to confirm_if_drafts_exist missing on v16
Removes call to missing utility on version-16-hotfix that prevented Material Request's "Create Purchase Orders by Supplier" dialog from working.
Purchase return of batchwise valuation batch valued at original receipt rate instead of batch avg rate
Fixes batch valuations being calculated at original receipt rate instead of current average rate, which stranded negative residues in batch values.
Round Production Plan mr_items quantity to field precision
Fixes floating-point precision loss in Material Request quantities derived from Production Plan, preventing unrounded values like 5738748.300863984 from entering the database.
Ability to disable / enable app
Allows disabling/enabling apps without uninstalling, hiding their APIs, pages, doctypes, scheduled jobs while keeping data intact.
Honour the doctype default print format in generator downloads
Resolves omitted print_format through the same choke point as printview so generator downloads honor the doctype default consistently.
Print the doctype default when a print format name does not resolve
Falls back to doctype default when print format name is stale or missing, covering renamed/deleted formats and null parameters.
Fall back to record name for card title
Displays record name as fallback when a Kanban card's title field is missing or empty.
Fix holiday count for date ranges spanning months
Fixes Monthly Attendance Sheet showing fewer holidays when date range spans month boundaries where day-of-month repeats (e.g. 15th of consecutive months).
Let string filters match an exact value
Adds `equals` and `not equals` operators to string filters so users can match exact values without being limited to distinct-value picker.
Make billing overview page responsive
Make billing overview page responsive
Use query.run() to get servers
Uses SQL union support added in early 2024 instead of separate queries.
A batch of July bug fixes
Shell blanking while user-list request in flight, posts publishing with no body when save races with paste — four fixes across four commits.
Two 1.0.0 freeze decisions: the at-bar checklist (ADR-0011) and the template-ref surface (ADR-0012)
Docs-only: adds at-bar checklist spec and ADR-0011 for public exports frozen at 1.0.0, plus ADR-0012 on template-ref surface decisions.
Parse `compose` + track modes-declared in the manifest
Adds `compose: list[str]` for ordered base recipe stacking and modes_declared flag to chef manifests.
Retire the 4 per-VM systemd hooks — firecracker-vm@ boots via boat verbs
Replaces four per-VM Python ExecStartPre/Post hooks with byte-compatible boat verbs so units boot through daemon commands.
Chef-facing API — neutral seam rename + bare-VM/snapshot/promote endpoints
Neutral seam rename (satellite→service), and adds chef-facing API: bare-VM provisioning, snapshot/promote endpoints.
Add a Tone Generator tool
Pure-tone generator (20–20,000 Hz) with waveform selection, musical note snapping, and A4 / 1 kHz presets.
Add a Metronome tool
Web Audio metronome: 30–300 BPM, accented downbeat, beats per measure, volume, tap tempo, and beat indicator.
Add an Audio Inspector tool
Inspect audio files locally: duration, channels, size, type, waveform, and sample rate read from WAV headers.
Open a saved recording in the Audio Editor
Adds "open in Audio Editor" action to library recordings for in-place trimming/fading without re-importing.
Export edited audio as Opus, not just WAV
Adds compressed audio export using browser MediaRecorder/WebM Opus alongside lossless WAV.
MariaDB variable editor
Introduces DB quick actions for Pilot-managed MariaDB: toggle Performance Schema, adjust InnoDB Buffer Pool, set max connections, restart.
Scheduled send and undo send via JMAP FUTURERELEASE
Implements Gmail-style undo send: emails held for 13 seconds with 10-second undo window.
Roll a team forward, month by month
Fixes simulator to roll state forward month-by-month instead of independently querying the database for each month.
Project a team's billing before it happens
Billing simulator showing invoices and next-state for any team and period without actually running the billing operation.
Say why collection will fail, when the data already knows
Adds collection failure prediction with three modes (Optimistic, Assumed, Derived) so operators know when a team can't be billed.
Split billing decisions from their effects
Separates billing decision functions (rating, dunning) from their effects so rules can be queried without performing them.
Drive the host verbs over HTTP, not SSH
Moves every host verb onto daemon's HTTP surface with journaled transport.
/watch reconciler hub, `boat pool` verb, and token rotation
Publishes reconciler observations to /watch, adds boat pool verb, and implements token rotation with hard-expiry and SIGHUP reload.
Drive the host verbs over HTTP, not SSH
Migrates host verbs from SSH to boat daemon HTTP transport so retried Tasks replay through operation journal rather than running twice.
Drive the standalone base-image ship over HTTP
Finishes SSH→HTTP migration by running standalone base-image export through boat daemon HTTP surface.
Mint, store, install and read the per-host Boat token
Server gains boat_token and boat_token_expires_at fields; Atlas mints fresh tokens instead of relying on operator-placed config.
Disable and enable apps on a site
Pilot integration for disabling/enabling apps: reads disabled state from Frappe and offers inline re-enable on app removal.
Export host and per-VM metrics to datum (spec ch.34)
Atlas control-plane half of metrics export: mints RS256 JWTs per resource, builds token files, and refreshes them on schedule.
Push host and per-VM metrics to datum (+ /metrics endpoint)
Exports host and per-VM metrics from the boat daemon to frappe/datum with Prometheus /metrics endpoint support.
Add live host utilization metrics (memory used, CPU, network, disk)
Adds host memory, CPU busy seconds, and network/disk byte counters read from /proc, exported to both datum push and /metrics endpoint.
Raise on JMAP method-level errors in changes calls
Fixes fetch_changes crashing with misleading KeyError when JMAP server returns method-level errors in response.
Prevent flashbang while theme switching
Prevent flashbang while theme switching
Sticky headers blending with dialog
Fixes sticky headers blending with modal dialogs by applying proper stacking context.
Improve grafana chart representation
improve grafana chart representation
Allow uploads with unknown MIME types
allow uploads with unknown MIME types
Only render children/slots if they exist
Fixes Avatar fallback and component defaults by not always passing empty default slots.
Stop assigning the Tenant Administrator role on Stalwart
Removes unnecessary Stalwart admin role assignment since mail admin calls are proxied through configured credentials.
Improve local network indicator
Uses server score and WebRTC stats to better detect network problems in Meet.
Widen beautifulsoup4 pin to resolve with frappe
Widens beautifulsoup4 pin range so a strict resolver can install frappe and suite together.
Allow serving files from bench root to support worktrees
Expands vite fs.allow to include symlinked app folders so Studio can serve worktree components.
Auto-revert when the update phase fails
Automatically reverts a failed update back to the previous revision without user intervention when app/validation phases fail.
Correct the DB analyzer's PostgreSQL diagnostics
Fixes database analyzer showing blank processes, incomplete storage, and incorrect lock info on PostgreSQL by adding engine-specific query paths.
Clone apps with full history on a dev install
Fixes dev installs cloning apps with depth=1, leaving them unusable to work on.
Prune temp packs left by a killed fetch
Cleans up orphaned git temporary pack files left by killed fetches that accumulate indefinitely and fill storage.
Keep the clock live so today moves at midnight
Fixes Calendar staying on yesterday past midnight and current-time line not moving by reading from a shared ticking ref instead of computing new Date() inside computeds.
Stop a cached doc overwriting fresher data in docStore
Ensures cached documents don't land after fresh server data and move docRef backwards in time.
Thursday, August 6
Incorrect batch-wise valuation rate for entries with same posting datetime
Tiebreaker now uses correct timeline instead of mixing Stock Ledger and Serial/Batch creation times.
Do not copy Blanket Order naming series to the mapped order
Sales Orders and Quotes from Blanket Orders now use their own series instead of inheriting.
Validate Blanket Order item quantity is greater than zero
fix: validate Blanket Order item quantity is greater than zero
Validate stock value and stock closing entry before period closing
Period Closing Voucher now validates stock ledger value and requires completed Stock Closing Entry.
Show warning over same label
Workspace shortcuts with duplicate labels now show a warning.
Add between operator to evaluate_filters
Filters can now use the `between` operator for range queries.
Key rate limits on the endpoint, not on `cmd`
fix: key rate limits on the endpoint, not on `cmd`
Skip desktop icon creation when the label is already taken
fix: skip desktop icon creation when the label is already taken
Render filters as plain txt
Prevents injection via dashboard chart filter values.
Return `Self | None` type from `doc.get_latest()`
Fixes return type annotation for better IDE and type checker support.
Form does not render when form sidebar is disabled
fix: form does not render when form sidebar is disabled
Keep quick-list controls buttons visible without hover
fix(quick-list-widget): keep quick-list controls buttons visible without hover
Only check for enabled users
Document follow notifications now skip disabled users.
Virtulization and pagination issue due to variable card height
Kanban board with mixed-height cards broke virtualization math; fixed by normalizing card heights.
Add perm. chk. to get_email_template
Prevents unauthorized access to email templates.
Enhance Unpaid Expense Claim report
Company, Department, Branch filters; Group By with subtotals.
Use date strings for mark attendance date
fix: use date strings for mark attendance date
Show the accounting nudge on the Accounting workspace
fix: show the accounting nudge on the Accounting workspace
Chart breaks when the chart type changes
Switching chart types no longer empties config slots.
Stop advanced charts re-rendering forever
Prevents re-render loop on finished event.
Set docker MTU before the enqueued setup plays
MTU now configured before enqueued jobs instead of after.
ServerListPanel conflict regression
fix(servers): ServerListPanel conflict regression
Legible AppShell chips
Replaced undefined ink tokens with legible background colors.
Rely on VS Code port forwarding
Adapted to Frappe's localhost-only dev server.
Broken ci and linter
CI and linter configuration fixed; pre-commit run across all files.
Audio Recorder slice
Browser-native Web Audio API; stores as private Frappe File.
Receipts — validated private image/PDF
Attach receipt images/PDFs (JPEG/PNG/GIF/WebP/PDF, max 10 MB).
Live ECB base-currency conversion
Fetches reference cross-rates from ECB; pre-fills conversion rate.
Personal Expenses core
Private, owner-scoped tracker with rule-based categorization.
Trips/Projects, Budgets, and bulk actions
Project/trip grouping, budget tracking, bulk categorization.
SSRF-guarded link metadata fetch
Validates DNS resolution and IP ranges to prevent SSRF.
On-device Script Conversion
Deterministic script conversion between Indic scripts without network.
Mention organization users inline
@-mentions in composer; mentions render as mailto: links in sent mail.
Suite setup
Setup wizard with welcome, workspace config, team invites, completion.
Cleaner Parent Node icon + rename the mind-map insert tile
Tile renamed from "Mind map" to "Parent Node".
Node text renders live while typing
Text editor paints above shape layers.
Mind-map branch connectors curve symmetrically up and down
fix: mind-map branch connectors curve symmetrically up and down
Mind-map branch connectors are structural
Connectors no longer selectable/editable; colour tracks child node.
Mind-map children aren't freely draggable; dragging a root moves the whole map
feat: mind-map children aren't freely draggable; dragging a root moves the whole map
Mind-map & flowchart nodes select to a plain border
Auto-layout nodes show selection outline only, no resize handles.
Subtle hover outline on the shape under the cursor
Blue halo indicates interactivity on hover.
Dropping a Parent Node drops you straight into typing
"New idea" seeded and pre-selected.
Mind-map gap-insertion add-node handles
Mind-map nodes show gap-insertion (+) handles for each insertion slot between children.
Recorder polish — presets, device, live waveform, tags
Quality presets (Voice/Music, compact/standard/high), device selection, live waveform, tagging.
Simple WAV editor / trimmer
Single-track audio editor built on browser-native Web Audio.
Move the update prompt into the sidebar footer
PWA update prompt moved from floating card to compact sidebar pill.
Refactor(editor)!: open a suggestion menu with a command, not an export
refactor(editor)!: open a suggestion menu with a command, not an export
Stop coercing neutral ink to a hue, and open suggestion menus from a button
Editor ink stays neutral; suggestion menus open from a toolbar button.
Upgrade an existing host's boat generation without a re-bootstrap
`Server.upgrade_boat()` brings a bootstrapped host up to the boat generation without full re-bootstrap.
Backend notification layer
Unified dispatch engine with in-app feed API, per-user read state, and email audit logging.
Run e2e tests as suite user
Tests now run as suite user instead of admin.
Add copy link action to creation toast
fix(meet): add copy link action to creation toast
Keep bracketed addresses out of the HTML parser
Addresses like `` in message bodies no longer get dropped by the sanitizer.
Letterboxed, overflowing YouTube embeds on the public reader
YouTube embeds with mismatched aspect ratios now constrain to 16:9 and respect max-width.
Assign Wiki User role without triggering nested User.save()
Prevents duplicate background task enqueues in multi-worker setups.
Thursday, July 30
Skip e-invoicing for opening invoices
fix(italy): skip e-invoicing for opening invoices
Let Purchase Receipt cancel defer to Frappe's linked-document check
Purchase Receipt cancellation now defers to Frappe's framework check for submitted linked documents instead of duplicating the guard.
Don't require cancel and delete perms to remove items via Update Items
fix: don't require cancel and delete perms to remove items via Update Items
Builder-like editing experience
Print format builder now matches Website Builder's editing feel with unified selection ring, proper layering, and draggable sections.
Print format builder editing UX polish
Print format builder now hides per-item toolbars during bulk selection, uses consistent selection ring across all elements, and adds bulk rename/delete.
Check calendar date fields against the doctype schema
`get_events` now rejects field maps naming start/end fields that don't exist, giving clear error instead of database error.
Clean up tab buttons and calendar UI
Refreshed tab button and calendar UI styling for consistency.
Keep the selection ring above field content
Print format builder selection ring now drawn as inset overlay instead of outline, and permission check falls back to boot.user when doctype meta unavailable.
Mobile list scrolling, large-list performance, and virtual skeletons
Fixed double scroll on mobile, pinned pagination to bottom, removed horizontal scroll on card layout, and improved virtual skeleton rendering.
Check permissions before returning a contact number for SMS
Contact number lookup now requires read access on both the contact and reference document.
Limit cross-user event lookups to System Manager
The `user` parameter of `get_events` now requires System Manager role; callers without it only see their own events.
Resolve inline email image paths inside the assets and site files directories
Inline image paths in outgoing email now resolve only inside the assets directory and site public/private files directories.
Limit Prepared Report access to the user who generated it
Prepared Report results now limit access to the owner based on user permissions; System Managers and explicitly shared documents unaffected.
Make button direct child so trigger values are capturable
fix: make button direct child so trigger values are capturable
Misc frappe-ui fixes
Fixed massive Combobox width due to field description.
Capture new feature adoption daily
Daily feature adoption tracking captured when telemetry enabled.
Misc frappe-ui fixes
Multiple UI fixes including full-name column headers, ID icon in filter dropdown, full-width Field Combobox, and Combobox in filters.
Render saved-view lucide icons in the view dropdown
fix(views): render saved-view lucide icons in the view dropdown
App sidebar background in dark mode
fix: app sidebar background in dark mode
Open link in new tab to avoid context
Links in lesson content now open in new tab via DOM sanitization on render.
Give every list page one declarative layout
List pages now use unified declarative layout components (ListPage, ListPageHeader, etc.) instead of hand-rebuilt duplicates, fixing mobile view.
Make student view a real route instead of editor mode
Student view moved from CourseEditor second surface to a real route at /courses/:course/learn/:ch-:lesson, eliminating embedded preview surface.
Accept any casing of an Indian state at checkout
Indian state field now uses a Combobox over the canonical list instead of free text validation, and includes all union territories that were missing.
Keep one-time passwords out of Account Request
One-time passwords now stored in cache instead of Account Request, fixing login failures for teams created outside Team.create_new.
Wire up three unreachable UI affordances
Cross-link deletion, text resize via corner drag, and nested element selection now wired to UI.
App install consistency
App Install dialog now reused everywhere for consistency.
Add spacing between navlinks and btns in sidebar
Sidebar navlink items can now have custom classes for additional customization.
Add binlog purge dialog and alert for server page
feat: add binlog purge dialog and alert for server page
Add audit follow-ups
Added background migration notifications, hang-guard records, rollback safety, and parser hardening from product audit.
Trim the message content if it's too long in toast
fix(meet): trim the message content if it's too long in toast
Chat notifications and chat ordering
fix(meet): chat notifications and chat ordering
Point default-branch references at develop
Default branch updated from main to develop in install.sh and README.
Implement staging trial provisioning for teams
feat(staging_trial): implement staging trial provisioning for teams
Bootstrap enrollment for Central and Pilot
Provisioning now hands benches single-use bootstrap tokens instead of durable credentials; benches mint their own via `bench enroll`.
Run Backup Site on a dedicated queue and worker
Backup Site now runs on its own `backup` queue and worker, preventing long backups from stalling other operations.
Installable PWA with iOS launch screens
Mail now installable as PWA with iOS launch screens; manifest and iOS metas attached only when on /mail route.
Admin bench create/drop accept install.sh's scoped nginx sudo grant
Admin API bench create/drop now check scoped nginx sudo grant instead of bare sudo, fixing bench operations on install.sh-provisioned hosts.
Bench address/manager reflect config immediately, not after full setup
fix: bench address/manager reflect config immediately, not after full setup
Safer db provisioning and port defaults
MariaDB/Postgres default ports changed to 3310/5450, fixed stale systemd unit survival, and added timeout error raising.
Map domain-provider exit 2 to a declined conflict, not unavailable
Domain provider exit code 2 (declined) now raises DomainConflictError instead of DomainProviderError, mapping to 409 instead of vague unavailability.
Show the declined-domain provider message to the caller
Admin API now shows actual provider error messages instead of one fixed generic string.
Prevent NaN for storage stats for macos
fix(ui): Prevent NaN for storage stats for macos
Shadow DOM with css tokens
Shadow DOM now ships with its own CSS tokens instead of depending on desk's.
Restore live site (asset-hash mismatch) + cap fieldnames at 64 chars
Repointed forms.html to actually-committed asset hashes and capped fieldnames at 64 chars.
Surface JMAP errors from sieve script set calls
Sieve script create/update/delete now properly detects and surfaces JMAP method-level errors instead of silently dropping them.
Show description on hover of SPF, DKIM and DMARC result
Mail MIME view now includes parsed Authentication-Results for each check and shows it as a tooltip.
Keep attachment blob URLs alive so Safari can download them
Attachment blob URLs now revoked on a delay instead of immediately after anchor click, letting Safari fetch before revocation.
Focus subject input when its label is clicked
Composer subject row now wrapped in label so clicking "Subject" text focuses the input.
Classify ledgers under a renamed reserved Tally group
Ledger classification now uses a renamed reserved Tally group's internal ID instead of display name, preserving account_type.
Fix/unicommerce display order and invoice fixes
Invoice generation now handles Unicommerce rejections via SQL error handling, and Sync Old Orders backfills Display Order No.
Allow cancel of security amount Loan Refund
Loan Refund cancellation now skips available-amount check and correctly adds refund amount back to security deposit.
Name a thread row after everyone who wrote in it
Inbox thread rows now name participants in order they first wrote, with user's own addresses collapsed to `me`.
Keep the in-cell editor pinned to its cell
In-cell editor position now updates continuously instead of only on selection, keeping it pinned to the edited cell through scrolling and zoom.
Decide the layout tier once, at load
Mobile and desktop layout tiers now decided once at load instead of re-swapping on resize, preventing unmounting of open surfaces.
Stop filter/pivot range outline from displacing the grid
Filter and pivot range outline now drawn at viewport extent instead of full range extent, preventing grid displacement.
Skip stale accounts in automation sieve rebuild patch
Automation sieve rebuild patch now skips stale account rows from before the account reshape.
Show an error page when the mail server is unavailable
Mail server connection failures now show an error page instead of rendering a blank page or opaque 500 errors.
Generate DB credentials at bench init, not bench new
MariaDB/Postgres root passwords now generated at bench initialization instead of bench creation, fixing the setup wizard's "use existing database" false positive.
Bench creation from a production sibling inherits its TLS choice
Bench creation now matches parent's admin.tls setting when unspecified and parent is production.
Keep branch name attached after pinned-commit/tag checkout
App repos now land on their configured local branch after pinned-commit/tag checkout instead of detached HEAD.
Hang-guard record identity + XML DOCTYPE/entity bypass
Fixed record identity lookup that misread Tally keys and added XML DOCTYPE/entity parsing guards to prevent bypass attacks.
Wednesday, July 29
Taxable-base resolver hook for custom charge types
Allows custom taxable value calculation for taxes (e.g., tax on MRP in India, differently-determined taxes in Brazil).
Add four Request for Quotation print formats built with the print format builder
Four new print formats (Bordered, Classic, Modern, Modern with Images) added to Request for Quotation.
Add four Quotation print formats built with the print format builder
Four new print formats (Bordered, Classic, Modern, Modern with Images) added to Quotation.
Add four POS Invoice print formats built with the print format builder
Four new print formats (Bordered, Classic, Modern, Modern with Images) added to POS Invoice.
Add four Purchase Invoice print formats built with the print format builder
Four new print formats (Bordered, Classic, Modern, Modern with Images) added to Purchase Invoice.
Add four Purchase Order print formats built with the print format builder
Four new print formats (Bordered, Classic, Modern, Modern with Images) added to Purchase Order.
Add four Delivery Note print formats built with the print format builder
Four new print formats (Bordered, Classic, Modern, Modern with Images) added to Delivery Note.
Add four Sales Order print formats built with the print format builder
Four new print formats (Bordered, Classic, Modern, Modern with Images) added to Sales Order.
Add four Sales Invoice print formats
Four new print formats (Bordered, Classic, Modern, Modern with Images) added to Sales Invoice.
Fall back to UOM Conversion Factor in Production Plan
Backport of UOM Conversion Factor fallback for v15-hotfix.
Stop the Subcontracting Receipt title from going stale
Subcontracting Receipt title now updates when the supplier changes instead of staying stale.
Update cost of BOMs created via BOM Creator
BOMs created via BOM Creator can now have their costs updated via the Update Cost button or BOM Update Tool.
Stop storing raw title template on subcontracting orders
Subcontracting Order and Inward Order titles now render templates correctly instead of storing literal `{supplier_name}` / `{customer_name}`.
Scope manufacturing warehouse filters to company
Default WIP, Finished Goods and Scrap Warehouse fields now list only warehouses from the current company.
Recover failed POS closings
POS Closing Entry can now be cancelled and resubmitted when its status is Failed.
Correct description on deferred revenue/expense
Field descriptions now correctly explain deferred revenue vs. expense behavior.
Add permission check for `get_item_details`
Adds user permission validation to prevent unauthorized item detail access via the API.
Clear deferred revenue/expense fields on uncheck
Service Start and End Date fields now clear when Deferred Revenue is unchecked on a Sales Invoice.
Replace incorrect usage of `frappe.in_test` with `frappe.flags.in_test`
Corrects test flag references in Purchase Price Change Validation.
Skip stock expense GL entries for non-stock items
Service items in Purchase Invoices no longer generate empty GL entries, fixing validation failures on stock expense accounts.
Fall back to UOM Conversion Factor in Production Plan
Production Plan now silently falls back to the UOM Conversion Factor doctype instead of throwing when an item lacks a purchase-UOM child row.
Guard against None row in get_stock_balance_for
Batch-tracked items called via API with no row parameter no longer crash on `row.use_serial_batch_fields`.
Respect child warehouse account override in Stock and Account Value Comparison
Child warehouses that override their parent's account are now correctly scoped to their own account, preventing in-transit transfers from cancelling under the same account.
Stop storing "{supplier_name}" / "{customer_name}" as the document title
Purchase Order, Sales Order, and Subcontracting Order now render title templates correctly instead of storing the literal placeholder.
Update operating cost when propagating workstation hour rate to routing
Propagates workstation hour rate changes to operating_cost in linked Routing BOM Operation rows.
Scope BOM Creator tree children to the parent row
When the same item is reused as a sub-assembly in multiple places, each occurrence now shows only its own raw materials instead of the union of all occurrences.
Sum semi-FG qty across split job cards
Fixes second job card overwriting the first's quantity instead of accumulating; work order now correctly totals produced_qty across all split cards.
Add reload option to user dropdown menus
Hard reload option re-added to both sidebar and Desk avatar dropdown menus.
Add in-app cloud settings embed
Desk now includes an in-app Frappe Cloud Settings dialog for billing, marketplace apps, domains, and advanced settings without leaving the app.
Layers panel (drag-drop + hover) and builder UX cleanup
Print format builder now has a draggable Layers panel for reordering sections/fields, hover field outline, and drop-field overlay inset to page edge.
Sanitize UTF-16 surrogate codepoints before FTS
Full-text search now handles UTF-16 surrogate codepoints without corruption.
Prevent Jump to Field dialog from stacking
Jump to Field dialog no longer stacks when opened multiple times.
Restructure restore without a copy and remove unused verbose
Database restore is now simpler and more efficient.
Role permissions manager breaks browser back navigation
Role Permissions Manager now preserves browser back history correctly when called from list view menu.
Isolate msgprint cases on a fresh page
Msgprint tests now run on isolated pages to prevent CI flakes from dialog state inheritance.
Handle large int serialization
Large integers now serialize correctly in JSON responses (reverts orjson regression).
None link handled and fixed except handler
Desktop icon with None link no longer crashes with unhandled exception.
Run before_print in builder renderer; guest-only 403 login
Print builder renderer now runs before_print hooks and sets link titles for beta PDF downloads.
Don't assume frappe.app exists when checking session expiry
Session expiry checks no longer crash on requests fired before app boot.
Publish last_query so assertQueryCount works on SQLite
SQLite driver now publishes `last_query` so assertQueryCount works on SQLite like it does on MariaDB and Postgres.
Improve `PrimaryDropdown` ux and new `IndicatorIcon`
PrimaryDropdown migrated to ItemListRow with inline actions and a new Indicator icon.
Migrate Autocomplete to Combobox
16 pickers migrated from old Autocomplete API to new Combobox with updated slot and event signatures.
Migrate to frappe-ui sidebar
CRM now uses frappe-ui sidebar component and updated to frappe-ui v1.0.0-beta.24.
Lucide icon picker for views
View modal now uses frappe-ui's searchable lucide icon picker with ~1000 icons instead of emoji-only picker.
Search and selector/dropdown widths
Search and dropdown components now render at correct widths.
Require a name to create/save a view
Save button is now disabled until the view label is non-empty (trimmed).
Play call recordings reliably
Call recordings now play with correct duration and seek support by streaming provider responses and forwarding HTTP Range headers.
Reference lines, funnel-from-measures, percent measures
Charts now support horizontal reference lines, funnels from multiple measures, and percent-formatted measures.
Prebundle headless Chromium in prod bench image
feat(server): Prebundle headless Chromium in prod bench image
Derive document ownership from a declared table
Document ownership rules now live in a declared table instead of field sniffing, covering partner records, SSH keys, firewalls, app plans, and child rows.
Add public IP for hetzner
Hetzner servers now support public IP configuration.
Set docker MTU during Hetzner server creation
Docker MTU is now set during Hetzner server creation to match the 1450 MTU of Hetzner's private network.
Refresh access token after app (re)installation
GitHub app reinstallation no longer leaves stale tokens; the callback now refreshes on `installation_id` even when no `code` is present.
Add "Published pages only" filter to Broken Links report
feat: add "Published pages only" filter to Broken Links report
Add draft-security-advisory skill for writing GitHub Security Advisories
feat: add draft-security-advisory skill for writing GitHub Security Advisories
Reload site uptime chart when site name changes
SiteUptime component now watches both siteName and window, matching the pattern used by SiteInsights.
Keep a BOM when its Tally secondary allocations exceed 100%
BOM secondary allocations exceeding 100% are now capped at 100 to match ERPNext's constraints (Tally allows independent percentages that sum beyond 100).
Set the target company on company Bank Accounts
Company bank accounts imported from Tally now have the target company set instead of relying on ambient default.
Run the Step-1 file preview asynchronously so a large export cannot time out
Large Tally export preview now runs in background job instead of inline, preventing request timeouts.
Report backend and frontend test coverage in the README and on pull requests
Backend (545 tests, 83.7%) and frontend (33 specs / 78 tests, 65.3%) coverage now reported in README and PR comments.
Keep link hover card opaque on browsers without color-mix()
Link preview hover card now renders with a literal white fill for browser compatibility instead of relying on color-mix().
Import Tally BOM co-products, by-products, and scrap as secondary items
Tally BOM rows classified as Co-Product / By-Product / Scrap are now imported as ERPNext BOM secondary items (previously only Component rows were imported).
Configurable advance payment handling on loan product
Loan Product now has a "How to Handle Advance Payments" option to choose between reducing tenure (EMI fixed) or reducing EMI (tenure fixed).
Build out the Mail Admin Dashboard
Mail Admin Dashboard now includes detail pages for directory resources (members, groups, mailing lists, etc.) and Emails, Reports, Observability, and Actions sections.
Add option to revert page changes since last publish
Added Revert Changes option in the primary button dropdown to restore published state from draft changes.
Refactor!: move the editor SPA from /wiki to /wiki-app
Wiki editor SPA moved from /wiki to /wiki-app so spaces can have pages at /wiki; squat removed from website_route_rules and can_render check.
Send reader's Edit button straight to GitHub for synced spaces
On public reader pages of git-synced spaces, the Edit button now opens the page's source file in GitHub's web editor.
Add cloud settings embed
Pilot now serves a cloud settings embed for Desk to load cross-origin with isolated styles.
TOTP powered 2FA
Two-factor authentication now supports time-based one-time passwords (TOTP) with recovery code fallback.
Address Greptile review findings on the recent PRs
Addresses review findings on BOM secondary allocation guard and related PRs.
Let paste/copy target the inline cell editor while editing
Copy/paste and cut operations now correctly target the in-cell editor instead of being hijacked to whole-cell operations.
Paint link hover card with a literal fill
Link preview hover card now renders opaque instead of transparent on all browsers.
Keep stock-account openings out of the opening JE under perpetual inventory
Stock account opening balances are now excluded from the opening journal entry under perpetual inventory to prevent validation failures.
List configured sites in `frappectl guide`
`frappectl guide` now prints configured site profiles with URLs, descriptions, and default/read-only tags for agent use.
Published pages honour author blank lines
Blank lines and single newlines typed in the editor now render on published pages instead of being stripped.
Grant the UI job contents: write so the frontend coverage badge publishes
Frontend coverage badge now publishes correctly with proper GitHub Actions permissions.
Seamless reconnects on network issue or stalls
Peer connection recovery now seamlessly reconnects on network stalls without user intervention.
Correct S3 presign region, push download status over socket
S3 presigned URLs are now signed in the bucket's real region (detected via `get_bucket_location`) instead of the client's default, fixing PermanentRedirect failures.
Resumable downloads + async folder-zip build
Fixes large folder zips truncating into corrupt archives and large files restarting on dropped connections by serving from storage with HTTP Range support and background job build.
Tuesday, July 28
Book Expenses Added To Stock GL entries
Backport to v16 of the develop-branch GL composer for Expenses Added To Stock, enabling proper accounting of costs like freight or insurance bundled into finished goods.
Incorrect creation time at cancellation
Creation time was being incorrectly set when cancelling an entry with the same posting datetime, causing data issues.
Align Opportunity status checks with Quotation statuses
Opportunity status checks looked for the obsolete Quotation `Closed` status instead of `Cancelled` and `Expired`, and didn't recognize `Partially Ordered` quotations as ordered. Now treats the right statuses and marks Opportunities Converted as soon as a Sales Order is created against part of a Quotation.
Pool batch slot values on every run, not only when negative
Batch slots' value differences were only spread across age slots when consumption had already driven one negative, leaving skewed splits (e.g., 10 units at 0 and 10 at 10 showing 0 and 100 instead of 50 each). Now pools slot values on every run.
Flaky test in exchange rate revaluation
Exchange rate revaluation test was non-deterministic due to time-based ordering; stabilized by using fixed timestamps.
Release raw-material reservation when closing a subcontracting order
Bin.update_reserved_qty_for_sub_contracting() skipped closed Purchase Orders but not closed Subcontracting Orders, so closing a partially-received SCO kept the raw-material reservation for the unreceived qty. Applied the same status != "Closed" filter to both paths.
Value batched packed-item returns from the original bundle
Return Delivery Notes / Sales Invoices built via the use_serial_batch_fields path had incorrect bundle valuations because the return bundle's voucher_detail_no stayed the Packed Item instead of remapping to the parent DN/SI Item. Valuation lookup now resolves via the parent_detail_docname when the direct lookup fails.
Keep manufactured item rate at zero when inputs are free
When a finished item was manufactured from raw materials consumed at zero valuation, _set_incoming_item_rate treated zero cost as missing and fell back to the item's own valuation rate, inflating the finished good's value on every production run.
Add support for async options in dropdown menu
Dropdown menu now supports asynchronously-loaded options.
Better read-only and impersonation banners
Improved visual design of read-only and impersonation banners on forms.
Consolidate view switching to single dropdown
List, kanban, and report views now use a single dropdown menu to select layout, available on mobile too (previously had separate dropdowns).
Add order to desktop menu item
Desktop menu items can now have a specified order so logout can be positioned last.
Constrain read-only Text Editor field height with scroll
Read-only Text Editor fields now scroll instead of expanding infinitely.
Don't show private custom workspaces on the dock
Private custom workspaces were showing on the app dock even though the new information architecture requires workspaces to be scoped under an app.
Grid row selection on touch
Touch-based row selection wasn't working on grids due to event handling differences between touch and click.
Stop build_index looping forever on an unindexable batch
SQLiteSearch.build_index advanced its pagination cursor only inside `if documents:`, so batches where all documents were rejected (no text-field content) never advanced the cursor and looped forever. Forward-port of #41249 from version-16-hotfix.
Get_locale_value() crashes when no language is set
get_locale_value() assigned value only when lang was set but always returned it, raising UnboundLocalError when no language was configured (e.g., bench console on sites that never set a language). frappe.sendmail() failed rendering emails because date-format lookup crashed.
Drop client-side grant-all rights for Administrator
Reverts the blanket grant of all rights to Administrator at all permlevels on every doctype. Administrator was getting submit/cancel/amend buttons on non-submittable doctypes like Bin, and malformed update_child API requests.
Validate HTTP method for document calls
Backport enforcing whitelisted methods' declared methods= on document-method routes (/api/v2/document/*/method/* and POST /api/resource/*/method routes), which was previously unenforced despite being enforced on /api/method/* and run_doc_method.
Resolve AttributeError in update_job_applicant_status exception handling
Fixed variable shadowing bug where the Document instance was overriding the string parameter job_applicant, and replaced job_applicant.log_error() with frappe.log_error() in the except block to handle empty/invalid strings.
Format earned leave schedule dates
Earned Leave Schedule dates in Leave Allocation now respect the System Settings date format instead of showing raw ISO dates.
Validate contact email/mobile and rework the primary dropdown
Draft states caused failures in contact email/mobile autosave. Consolidated duplicated contact panel logic from Contact.vue and MobileContact.vue into a shared util and reworked the primary dropdown.
First Ticket tag and tag charts on the dashboard
A "First Ticket" tag is now applied automatically to each requester's first ticket, plus two tag charts on the dashboard to surface patterns.
Convert link_filters to dict before search_link
Setting **Link Filters** on a Link-to-User field via Customize Form broke the New Ticket page; user_query expected a dict but received a list of lists from Customize Form.
Keep the last recent activity row out of the bottom fade
The last row in **My Recent Activity** was always rendered faded because the bottom scroll fade was pinned to the card with no notion of scroll position. Added padding to push content above the fade.
Drop the razorpay dependency
LMS pinned razorpay~=1.4.1 while payments (a required app) pins razorpay~=2.0.0 — disjoint ranges that bench only resolves by luck. Nothing in LMS imports the SDK; payments owns it. Dropped the dependency to stop chasing version ranges.
Count a coupon redemption once per payment that was actually paid
Coupon redemptions were counted wrong (two concurrent redemptions both read the same count, one was lost), and gateway retries picked the wrong Integration Request. Fixed race condition with atomic update and used the correct request for retry.
Resolve private lesson media whose file_url contains _ or %
Uploaded lesson PDFs failed to load (403) for enrolled students when the file name had an underscore or %. The access check escaped _/% in a way the query builder double-escaped, so it matched nothing and denied access. Used bound query to fix escaping.
Seed Google Meet account form on mount
GoogleMeetSettings edit swapped list and form with v-if/v-else, mounting the form fresh on every open with accountID already set. The watcher had no `immediate` option so it never fired; saving also called rename_doc with an empty new_name.
Broken access control
Added server-side authorization checks to get_profile_details (filters privileged roles from students), track_video_watch_duration (requires lesson access), and submit_quiz (requires quiz access).
Stop razorpay from breaking
Razorpay <2 imports pkg_resources at module level; setuptools 82 dropped it. LMS imported razorpay at module level in a hook that runs on every session, so any bench with setuptools ≥82 returned HTTP 500 for all requests including login and Desk. Bumped razorpay past the broken range and moved the import inside the get_client() call.
Replace centralized host mesh controller with ANCP (Atlas network control protocol)
Introduces `atlas-networkd` daemon using a distributed network protocol (ANCP) instead of a centralized controller for private networking.
Sleepy VMs: idle VMs sleep to free RAM and wake on the first inbound TCP connection
Puts an idle VM to sleep and resumes it on demand via host reboot recovery or — transparently — the first inbound TCP connection. Sleeping VMs keep their disk but release RAM to the host. Opt-in per VM via `sleep_on_idle`.
Surface sheets in Drive as content files
Sheets are now a Drive content-app; each new Sheet creates a backing Drive File, so sheets show up in — and open from — Drive just like Writer and Slides.
TDS filing integration
Added TDS (Tax Deducted at Source) filing integration.
Access slot props, pass dynamic slots, add components from context menu
Components inside a slot can now access slot scope/props, dynamic slots can be passed, and components can be added from the context menu.
Card-per-question layout for the public form
Splits the single form card into one quiet card per question on the public respondent form, following the Google Forms pattern with hairline borders, 10px radius, generous padding.
Mobile PWA navigation shell and touch UX
Mobile-only revamp of Mail's chrome with a bottom tab bar (Mail, Screener, Search, Profile) and Compose FAB; desktop unchanged. Tab and FAB step aside in thread view, selection mode, and search.
Admin password reset
Added admin password reset and sessions management UI.
Match Tally group names case- and whitespace-insensitively
Customer/Supplier classification was keyed on exact, case-sensitive match of Tally group names (e.g., `SUNDRY DEBTORS` vs `Sundry Debtors`), so mismatched groups silently imported parties as plain ledger Accounts instead.
Show all day event as all day event
All day events now display as "all day" instead of "12am - 12am".
Run invite account creation as Administrator
The invite/request-key endpoint runs as Guest but the setup it triggers (archive mailbox / automation sieve) resolved ownership from the session user, throwing "account does not belong to Guest" and rolling back, then every retry failed with primaryKeyViolation.
Use semantic tokens instead of tailwind text classes
Replaced old text colors with semantic text-ink tokens in the button component to fix color contrast and accessibility issues.
Preserve caller aria-label; Checkbox: emit model updates once
Button was silently discarding caller-provided aria-label and overwriting it, and Checkbox was emitting model updates multiple times per change.
Use updated loan limit for disbursement
A secured term Loan could be submitted without a Maximum Loan Amount; adding it after submission didn't persist correctly and Loan Disbursement calculated available limit as zero, failing disbursement.
Saturday, July 25
Block sales invoice submit when customer overdue exceeds threshold
Backport of credit limit enforcement: blocks Sales Invoice submit when a customer's overdue amount exceeds configured limit unless the user holds a bypass role.
Map pick list customer to delivery note when no sales order
fix: map pick list customer to delivery note when no sales order
Enable the 'Include Zero Stock Items' filter by default to show zero-stock items in the Stock Balance report
fix: enable the 'Include Zero Stock Items' filter by default to show zero-stock items in the Stock Balance report
Map MT940 per-transaction reference from :61: customer_reference
MT940 import was using the statement-level reference for all rows (making them indistinguishable) instead of the per-transaction reference.
Respect user permissions in party dashboard company list
Party dashboards were bypassing user permissions and iterating over all companies, exposing restricted data on forms.
Ignore permission while deleting user permission
fix: Ignore permission while deleting user permission
Silent autosave status and lighter builder chrome
Print builder autosave is now silent when saved, shows brief "Saving…" only during requests, and sticky red "Save failed" on error; drops "Reset Changes" and one-item section headers.
Open builder preview in a modal instead of a dock
Print preview now opens as a centered modal over the builder instead of a docked rail; gives preview full width and matches on-demand UX.
Add incident time and confirm noisy neighbours
Investigation now accepts optional `incident_time` for a centered 12-hour window (instead of trailing 24 hours), and confirms noisy neighbor detection.
Explain what makes a frappe version range invalid
Error message for invalid version ranges didn't name the range or explain the cause; now clarifies what makes a range invalid.
Set frappe requirement to >=15.0.0,<17.0.0
Prerelease version bounds were failing validation; corrected to use stable semver ranges.
Reload bench apps page on deploy update
fix(ui): Reload bench apps page on deploy update
Remove conflict markers from frappe version requirement
Backport merge left unresolved conflict markers in `pyproject.toml`, breaking TOML parsing and making bench unable to read the dependency.
Enforce app-version compatibility on deploy
App compatibility was validated on every save, causing deadlock when a release group had multiple incompatible apps; moved check to deploy time.
Fix branch-change tests broken
Tests were hitting the GitHub API and failing; mocked the `frappe/__init__.py` lookup so tests stay offline.
Add more anonymized telemetry
feat(meet): add more anonymized telemetry
Google Sheets keyboard shortcuts + fix whole-line select anchor
Adds Shift+Space / Ctrl+Space / Ctrl+Shift+Space for row / column / whole-sheet select, Ctrl+Alt+=/- for insert/delete, and Ctrl+Shift+1…5 for format shortcuts; fixes Shift+Space anchor jumping.
Homepage list view — header sort, toolbar search, full-width scroll
Sheets homepage list now sorts from column headers (click to sort, click again to flip), toolbar search, and full-width scrolling; replaces separate "Sort by" dropdown.
Upgrade to frappe-ui v1
Upgraded Frappe Wiki to frappe-ui v1 (beta.25), migrated v1 component APIs, rebuilt editor chrome on frappe-ui atoms, and bumped tiptap to v3.
Integrated Code Editor [Experimental]
Built with Monaco editor and frappe-ui; allows editing code directly in Pilot.
Align CI and tests
CI and test base classes were misaligned with the version-2-beta branch; added correct Frappe/ERPNext versions and changed test cases to use FrappeTestCase.
Hide comment action if we are creating a comment
fix(writer): hide comment action if we are creating a comment
Update collaboration avatars in real time
Document loader wasn't shown on navbar due to missing reactivity; added `useCollaborationUsers` ref to track awareness users.
Include formula-cell values in selection Sum/Avg
Selection stats were miscounting formulas by reading raw cell content instead of computed values.
Handle errors when offline or server unreachable
fix: handle errors when offline or server unreachable
Pass is_private as false correctly
fix(file): pass is_private as false correctly
Paste without a priming click + refresh formula bar on paste
Paste did nothing unless the grid was focused, and the formula bar showed stale values right after a paste operation.
Remove invalid doc.guardian reference breaking guardian search functionality
Guardian search was filtering with a nonexistent field, blocking users from linking Guardians to Students via the Relations tab.
Preserve repayment_type before building GL entries on repost
Loan Repayment Repost was rebuilding GL entries with the wrong account and voucher_subtype when `before_validate` hooks changed the repayment type.
Friday, July 24
Warn when a draft linked document already exists
When creating a follow-up document (e.g. Delivery Note from Sales Order), confirmation dialog warns if a draft linked to the same source already exists with clickable links.
Make Shipping Rule Cost Center optional with company default fallback
Cost Center on Shipping Rule is now optional; falls back to company default, avoiding P&L account validation errors for income accounts.
Proforma Invoice against Sales Order
New submittable, non-accounting `Proforma Invoice` doctype (posts no GL/stock) for advance payments, created only from Sales Order with per-line Quantity/Amount basis.
Log exception instead of swallowing in notify_errors
Error logging now reports exceptions instead of silently swallowing them.
Restore Save button on reverse journal entry
Save button was missing from reverse journal entry form.
Incorrect creation time at the time cancelling an entry
Document creation time was incorrectly set when cancelling entries with same posting datetime.
Drop translation marking from default warehouse names
Warehouse names were marked for translation at creation but never actually display translated (docname carries untranslated company abbr); removed marking.
Respect selected BOM when creating work order for variant item
Non-default BOM selection was silently reset to the variant's default BOM; now only substitutes for template BOMs.
Production Plan raw material qty calculation and bin reservation
When same raw material appears in multiple Production Plan rows, safety stock and MOQ were added per-row instead of once; now reserves it as a floor.
Map pick list customer to delivery note when no sales order
Creating a Delivery Note from a Pick List without a linked Sales Order left the Customer blank; now falls back to the Pick List's own Customer.
Guard against missing is_your_company_address custom field on Address
Controller reads `is_your_company_address` as a bare attribute, crashing with AttributeError if the optional custom field is missing (e.g. after interrupted migration).
Rebalance batch slot values at the pooled rate when driven negative
Batch valuation showed small negative bucket values when consumption drove a slot negative; now spreads batch pool value across slots proportional to qty.
Create default warehouses with untranslated names
Warehouse names were translated at creation, breaking opening-stock fallback lookups from sessions in different languages.
Do not translate default record lookup keys
Company creation was looking up Department root via `_(\"All Departments\")`, missing it on non-English sites and corrupting the tree.
Do not translate root Item Group lookup key
Non-English setups stored the root under a translated name, making new groups save with blank parent and become uneditable second roots; now uses `get_root_of`.
Accept dict target_doc in mapper endpoints
With native JSON request bodies, `map_docs` forwards `target_doc` as a dict, breaking all "Get Items From" buttons; now accepts dict/str/Document.
TypeError in get_batches_by_oldest for mixed batch expiry
Fixes crash when a warehouse has both dated and non-expiring batches; expiry_date is nullable but sort was comparing directly.
Full screen toggle for the builder preview
Print builder preview can now toggle full-screen; same iframe grows to viewport with Esc or shrink button to restore dock.
Update private workspaces on user rename
When a user's email changes, their private Workspace documents are now renamed and updated.
Re-hash vue-style bundle filenames after inlining CSS
CSS-only edits now mint new bundle URLs instead of shipping under browser-cached ones.
Close the bordered child-table bottom and drop the doubled header line
Fixed child-table styling: bordered tables now close cleanly without doubled header line.
Missing doctype name in breadcrumbs
Doctype name was missing from breadcrumb navigation.
Notifications with the dock
Notification panel now shows up correctly with the dock.
Remove hover effect from column/table resize handle
Column resize handle no longer darkens on hover, reducing visual noise.
Pass parent doctype when fetching child table link values
Fetching a Link field from a child-table row was failing permission check because parent doctype wasn't passed to `get_value`.
Unbuffered sync from mariadb to duckdb
Batches rows into Apache Arrow columnar format for zero-copy DuckDB ingestion.
Stable memory consumption while syncing
Large GL syncs (1.5M rows) to DuckDB were accumulating memory; now drops consumed objects.
Get_list_context called twice when rendering a portal list
Portal list pages were calling the doctype's `get_list_context` hook twice, duplicating queries and sidebar work.
Use a re-entry flag instead of freezing during mapped doc guard runs
Freeze overlay at z-index 2000 was covering confirmation dialogs from guards (at z-index 1140), blocking user interaction; replaced with re-entry flag.
Replace swap metrics with OOM for server health check
Server health monitoring now tracks OOM instead of swap metrics.
Raven channel name for alerting server health
Channel name now follows slug convention: "frappe-cloud-server-alerts".
Navbar refresh, fix blank Breadcrumbs page, and speed up dev cold load
Docs site polish: full-width navbar, sidebar styling, centered search, anchor link fixes, IntersectionObserver for active headings.
Actually unify sites and assets
Unified list view for sites and VMs removes confusion about where site creation happens (Pilot, not Central).
Responsive sidebar
Mobile-responsive sidebar using frappe-ui desktop/mobile shell components and bottom-sheet for mobile.
Meet links on existing events, richer meet row
Meet links can now be added to existing events via new `create_meet_link` endpoint; event updates now preserve existing links.
Meet stats for nerds
Developer stats panel for Meet showing detailed metrics.
Store Entry browser to browse Tantivy search indexes
Read-only Store Entry browser now extends to search indexes alongside Data/Blob stores using schema-agnostic `SearchIndexBrowser`.
Sheets homepage filters, recency groups, and server-side pagination
Sheets homepage upgraded: ownership tabs (All/My/Shared), sort control (Modified/Name/Owner), recency groups (Today/Previous Days/Earlier), server-side pagination.
Auto-link URLs and link preview hover card
URLs (https/www/common TLDs) auto-detect and auto-link in cells; hover card previews with quick actions.
Multi-line cells via Cmd+Enter with auto-growing rows
Sheets now support Google-Sheets-style multi-line cells; Cmd/Ctrl/Alt+Enter inserts newlines, rows auto-grow to fit.
Server overview metrics
Pilot integration for server overview metrics on the Central dashboard.
Add Credentials settings tab to manage JMAP connection
New Credentials tab under Mail Settings lets users view/update JMAP connection fields (Username, App Password, Server URL); Password is never prefilled.
LLM integration
New LLM integration in settings with task debugging: setup in settings, explain/query errors with full context, stream output via SSE.
Make a bench fully operable without root after install
Privileged operations (nginx, certbot, supervisor, modsecurity) now run once in root installer pass or through scoped sudoers; bench user no longer needs passwordless sudo.
Versioned releases and in-app self-update
Moved from git-tracking to versioned releases with in-app updates; GitHub releases include prebuilt frontend, `install.sh` pulls latest, Settings shows version with check-for-updates.
Render SVG at zoomed size
Server map SVG now renders at proper zoomed size.
Active highlight for sidebar item
Sidebar active state highlighting now works correctly.
Misc sidebar issues
Sidebar UI polish: fixed switch label colors and migration button spacing.
Screener polish, Screener settings tab, iOS install banner
Mail screener UI polish: full-width explainer slab, Screener settings tab, iOS install banner as fixed bottom sheet.
Enable settings shortcuts
Settings shortcut (Meta+Shift+,) now works across all apps.
Ignore paused producers in stall detection
Meet stall detection was flagging paused video/audio producers as stalled.
Anchor release tarball excludes to repo root
`tar --exclude` was matching patterns globally (e.g. `--exclude=benches` also matched `admin/backend/api/v1/benches/`), shipping incomplete tarballs.
Install Redis system-wide from the installer
Every bench runs its own Redis, but the installer never installed it system-wide; `RedisManager.install()` tried to sudo-install at bench-init, failing without passwordless sudo.
Enable lingering in the root pass, verify it in the bench-user pass
Follow-up fix: moved lingering enable to root installer pass (where it belongs) and added verification in bench-user pass.
Enable systemd lingering for the bench user at install time
Bench services run as systemd user units, but lingering was only enabled after MariaDB provisioning (the first `systemctl --user` caller), causing install to crash.
Skip frontend Node deps on released installs
Released installs were pulling `node_modules` for the admin frontend despite never compiling it; now gates on `is_dev_install`.
Serve bundled admin UI on released installs instead of rebuilding
Released installs were rebuilding the admin UI on every `bench init`, even though the tarball ships it prebuilt; now decides by version flag.
Show real sheet owner in Share dialog instead of current viewer
Shared sheet's Share dialog mislabeled the real owner as yourself; `get_sheet` never returned `owner` field.
Re-baseline undo history after load so insert-column undo doesn't blank the sheet
Inserting a column and pressing Undo blanked the grid; history baseline was initialized before sheet data loaded, capturing empty state.
Keep renamed sheet tab in place instead of jumping to the end
Renaming a sheet tab moved it to the last position; now preserves position by restructuring the sheets object carefully.
Import context menu in grid view
Missing context-menu import in Drive grid view prevented it from opening.
Thursday, July 23
Made territory field multi select
Territory field on accounts receivable reports now accepts multiple selections.
Get reserved batch qty precision from settings (v16)
V16 backport of reserved batch qty precision fix.
Get reserved batch qty precision from settings
Reserved batch comparison now respects field precision instead of hardcoding 6 decimal places.
Seed cancelled voucher replay from before its posting datetime (v15)
Cancelled voucher replay now uses the correct previous balance, preventing double-counting when SLEs share the same posting datetime.
Disable Werkzeug debugger
Development server no longer exposes Werkzeug interactive debugger.
Remove s3/gh code assets fetching logic
Removed unused S3/GitHub code asset fetching that was causing 1-2s build delay.
Add guard hooks to open_mapped_doc
Adds sanctioned extension point with `add_mapped_doc_guard()` and `should_open_mapped_doc()` to intercept before opening mapped documents.
Duplicate title in list view settings dialog
Removed duplicate title in list view settings dialog.
Detach duration picker to avoid css issue
Duration picker now renders detached to avoid CSS stacking context issues.
Preview in print format builder for cancelled documents
When print format settings disable printing cancelled/draft documents, those documents no longer appear in the preview filter.
Handle orphan doctypes doctypes
Orphaned doctypes no longer cause errors during sync operations.
Store OAuth state server-side instead
Google OAuth hardening with server-side state storage instead of JSON encoding.
Display ticket priority as icon and level
Replaces arbitrary `integer_value` on HD Ticket Priority with purposeful `level` field (Urgent/High/Medium/Low) and renders as icon + name.
Rtl support
RTL support backport with physical-to-logical Tailwind utilities and directional icon rotations.
Recent Activity card on Home dashboard
Agents now see a Recent Activity card on home showing recently-acted tickets with action types (Replied, Commented, etc) and clickable rows.
Load real italic faces through the ital axis
Google Fonts loader now requests italic axis alongside weight, so italic text renders with real italic faces instead of browser-synthesised slant.
Align border control with spacing split-mode inputs
Border control now supports split-mode inputs (top/right/bottom/left) matching spacing and border radius layout.
Invite users to Builder
Site members can now be invited to Builder by email without going through Desk; invitees get Website Manager role on accepting.
Default screening on only for personal accounts
Email screening now defaults to off; only personal accounts get it on by default, shared/delegated stay off.
Enable hot reload by default on dev benches
Dev benches now hot-reload both Python and JavaScript by default without explicit bench.toml settings.
Slicers — floating value-filter controls
Draggable in-sheet panels that filter by column values via checklist, reusing the existing sortFilter engine.
Recoverable trash for deleted sheets
Soft-deletes sheets to trash instead of hard-deleting; 30-day retention with recovery like Google Drive/Figma.
Complete llm hosting
Completes LLM hosting service with console activation, API key issuance, and per-site enable via Pilot.
Keep forwarded emails in the same thread
New per-account setting to add `In-Reply-To` headers to forwarded emails so they thread with originals.
Add basic DB analyzer support
Basic database analyzer support with lock wait timeouts, active connections, and process list tasks.
Databse Insights
Adds database insights with lock wait timeouts, active connection counts, binlog purge information, and process list.
Name the bench in the wizard's finish hints
Setup wizard now names the bench in finish commands when multiple benches exist.
Use alpha gray for focus and open item backgrounds
Menu background no longer shifts when a submenu opens; focused and open states now both use alpha tokens.
Properties panel stealing focus from text editor
Properties panel writes no longer steal focus; color picker can be dragged, text highlighting persists, and arrow keys work in numeric inputs.
Stack avatar group to the right
Avatar group now stacks to the right for better layout.
Allow moving a block inside a slot and deleting a slot from layers panel
Layers panel now supports moving blocks into slots and deleting slots, helpful when the UI drop target is too small.
Fix notifications empty state alignment
Notifications empty state now aligns with tab buttons via responsive left margins.
Preserve tree expand/collapse state on column freeze
Tree expansion state is now retained when freezing/unfreezing columns.
Punctuation jumping when editing text elements
Enabled contextual alternates on ProseMirror editor and fixed text run shaping to prevent punctuation from jumping vertically during editing.
Mention dropdown stays dead after typing a name with no match
Mention suggestions dropdown now re-opens after typing a non-matching query and deleting back to a matching prefix; was failing due to conditional root element rendering detaching popover content.
Wednesday, July 22
Ensure payments app installed on the site in payment_app_import_guard
Prevents errors when payment operations run before the payments app is installed.
Sync process loss percentage when FG qty changes
Manufacturing rework now re-derives stale process loss percentage when finished goods qty changes.
Show transaction currency symbol in Payment Request schedule dialog and reference table
Multi-currency Payment Requests were showing company currency symbol instead of transaction currency.
Read serial and batch flags from Item in Stock Balance's SLE query
Stock Balance query was missing `has_batch_no` and reading `has_serial_no` from wrong column, breaking batch/serial consumption matching.
Rescale stock ageing FIFO slot values on stock reconciliation
Stock Ageing showed negative bucket values when revaluing existing stock; each slot's value is now re-derived as qty × valuation_rate.
QUERY HTTP method (RFC 10008)
Frappe API now supports RFC 10008 QUERY HTTP method for GET-like transaction semantics with POST-like body handling.
Store builder snippets in a DocType
Print Format snippets moved from localStorage to a DocType, making them exportable and shareable across sites/devices.
Web Form: add request-key access for one-time links
Web forms can now be shared via one-time private links with pre-filled context, enabling secure workflows for non-users.
Add print option in form menu on mobile
Print action now appears in form menu on mobile devices for easier access.
Collapse interaction for dock
Workspace dock collapse interaction is now working.
Multiple changes in duckdb sync
DuckDB sync now uses db_port from frappe.conf, shows filenames, ignores links on cancel, and doesn't set primary key.
Give datatable a definite height on mobile
Query reports on mobile now render with proper datatable height so HyperList virtual scrolling works.
Add ignore_permission param to remove_user_permission util
User permission removal now accepts ignore_permission parameter.
Rename workspace missing icon in db
Workspace icon naming is corrected in database.
Make the create new button subtle
Create new button styling is now more subtle.
Make shell selection module first
Sidebar selection is now module-based instead of role-based.
Check image before trying to load in print
Print formats now skip empty image attachments instead of attempting to load them.
Restore compact email button size
Email button sizing regression from spacing redesign is reverted while keeping dark colors.
Don't flag builder blocks as missing fields in the outline
Builder-only fieldtypes (Repeater, Spacer, Divider) no longer wrongly report as missing fields.
Respect select field ordering
System console output columns are no longer forced to sorted order.
Show a session expired message and redirect to login instead of "Method Not Allowed"
Expired sessions now show a clear message and redirect to login instead of cryptic "Method Not Allowed" errors.
List view filter on child table link field with ignore user permissions
Filtering by child-table Link fields with Ignore User Permissions no longer fails validation.
Dock the preview, move print settings to a dialog, section radius
Print Format Builder preview now docks beside the canvas with live refresh and improved print settings UI.
Fix pytz to filter out deprecated timezones
Timezone API now excludes deprecated entries like Asia/Calcutta using pytz instead of zoneinfo.
Broken spacing in email templates
Redesigned email containers with proper card layout, padding, and typography.
Persist allow_bulk_edit for custom table fields
Allow Bulk Edit checkbox was auto-unchecking on save for custom fields; added missing column to Custom Field doctype.
Empty state text for list views
Fixed button styling and simplified empty state messaging in list views.
Connected app: add permission check & sanitize redirects
Prevents redirect injection and unauthorized app flows.
Add permission checks to prepared_report & query_report
Hardens report access by adding permission validation to prevent unauthorized access.
Filter system users in department approver tables
Department approver fields now filter to show only System Users, preventing Website Users from being selected.
Doctype settings map
Standardizes doctype settings metadata across HRMS.
Skip expire_allocation for already-cancelled Leave Allocations
Leave expiry no longer processes cancelled allocations.
Exclude cancelled Vehicle Log records from service expense report
Service expense totals no longer inflate from cancelled vehicle logs.
Exclude cancelled Attendance records from employee timeline
Employee dashboard timeline now filters out cancelled attendance entries.
Exclude disabled users from approver list
Disabled users no longer appear in leave, expense, and shift approval searches.
Allow manual product sync regardless of bidirectional toggle
Manual product sync is now always available independent of bidirectional setting.
Lead/deal report 500s when a child-table column is selected
Permission conditions now properly qualify column names to avoid ambiguity when child tables join.
Add playbook to update ProxySQL on proxies
Playbook added to upgrade ProxySQL from 2.3.2 to 3.0.9 across all proxies with atomic backup and rollback.
Allow more actions on inactive sites
Inactive sites now support reinstall, restore, migrate, and update operations; update_without_backup now matches schedule_update allowed states.
Ignore failed-over proxies in wildcard skip check
Wildcard DNS check no longer counts failed-over proxies as active, preventing per-site record misplacement.
Make partner lead page a lil responsive
Partner lead page now renders functional layouts on mobile.
Improve app-mismatch error when moving a site
App mismatch errors now bold offending app names and link to documentation.
Branch change for framework
Framework branch changes are now allowed if major version matches the release group.
Determine post-login redirect route entirely in backend
Login flow now determines redirect route server-side instead of trusting frontend logic.
Send already-logged-in product signup through quickstart
Logged-in users completing product signup are now routed through quickstart flow.
Add read-only SQL query command
CLI tool now includes read-only SQL query command with interactive table results and piped/JSON output support.
Slugify server subdomains
Server subdomains are now automatically slugified and polished UI added for new server page.
Add missing indexes
Performance indexes added for Invoice, Payment Attempt, Usage Rollup, Subscription, and Credit Ledger Entry queries.
Unified assets list view
Servers and sites now unified in single console map + list view, allowing single-site users to find their site and multi-site owners to see everything at once.
Rollback imports on failure
JMAP importers (Mail, Calendar, Exchange) now stage imports atomically; failure at any point rolls back the entire batch.
Custom event invitation emails with RSVP links
Calendar now sends custom invitation emails with HTTP RSVP links, with configurable Mail Settings toggle.
Add Suite User and Suite Admin roles, simplify Mail/Calendar permissions
New Suite User and Suite Admin roles replace blanket All role with owner-scoped, role-based permissions for Mail and Calendar.
Draggable corner radius handle
Slides designer now offers draggable corner handles for round rectangles, images, and videos.
Redesign event modal
Calendar event creation modal redesigned with two-pane layout, grouped date/time card, participants rail, and human-readable repeat rules.
Google-Sheets formula UX — click-to-range, auto-close parens, range suggestion
Sheets formula editor now supports Google Sheets parity features: click-to-extend ranges, auto-closing parentheses, and range suggestions.
Writer-style share dialog redesign
Sheets share dialog now matches Frappe Writer/Drive style with unified typography and consistent design language.
Harden ingest: validation, dedup, capture rules, event catalog
Event ingestion validation hardened with dedup logic, capture rules, and event catalog.
Namespace gateway payment id by provider
Gateway payment IDs are now scoped by provider to prevent ID collisions across multiple gateways.
Add tsconfig for type stuff in admin dashboard
TypeScript configuration added for admin dashboard.
Implicitly allow dropping in a component that has a default slot + other slot fixes
Components with default slots can now wrap other components without explicit slot passing.
Forward sidebar-item slot to SidebarSection
Sidebar component now properly forwards slot when using sections API.
Fill unpinned column before creating a 2nd column
Meet video grid now fills a single column before wrapping to multiple columns.
Ask for device perms on demand in device settings
Frappe Meet now requests device permissions on-demand in settings instead of upfront.
Unify sidebar state and hide storage labels on collapsed
Sidebar state is now consistent across sections and labels hide when collapsed.
Stop the login layout from shadowing bare /mail
Bare `/mail` URL no longer shows empty account creation card for logged-in users.
Reset stalled receive connection
Frappe Meet connection stalls are now recovered.
Smooth, tight-fitting document title input
Sheets document title input no longer jitters on keystroke by removing width animation and using native input sizing.
Resolve event masters via baseEventId so fresh events can be edited
Freshly created calendar events can now be edited immediately by resolving masters via baseEventId instead of stale search index.
Allow site operations in production
Site operations now work in production by allowing passwordless sudo access to nginx.
Drop certbot quotes
Certbot configuration no longer includes unnecessary quote escaping.
Certfile test is root-only
TLS certificate tests now handle permission-denied gracefully in non-root runs.
SSL flag
Removing SSL ready flag no longer takes away HTTPS from other sites.
Sunday, July 19
Scope current serial nos to the selected batch in stock reconciliation
Serial numbers in stock reconciliation now scoped to selected batch instead of pulling from all batches in warehouse.
Live preview renders unsaved edits through the print pipeline
Live preview now renders unsaved edits via the print pipeline; canvas values from server's `get_formatted` kill preview↔print drift (address `
`, currency, links).
Custom permission types denied for Administrator on client
Restores evaluation of custom permission types for Administrator on client after merge conflict from backport.
Make builder preview pixel-match print output
Aligns print format builder preview styling with print output (light-theme lock, token values, gray palette).
Preserve numeric values across locale formats
Numeric filter values (e.g., 7.95) are preserved across locale-sensitive number formats instead of being truncated to integers.
Scope preview cleanup to generated files only
Prevents deletion of user-attached files when regenerating print format previews; saves new preview before cleaning stale ones.
Sweep all stale preview images on regenerate
Sweeps all pf-preview-* files before saving fresh preview, preventing orphaned files from interrupted renders.
Exclude Closed status ToDos from get_assigned_users
Syncs assigned users between single page and list page by excluding closed status todos.
Add thin Central proxy + JWKS-based bench↔Central auth
Central billing client and site-billing admin routes with JWKS authentication; usage meters composed server-side.
Add template renderer
Minimal Jinja2-like template renderer to simplify nginx config code and reduce f-string complexity.
Readable Flow Session transcript, Flow Run tweaks
Flow Session transcript renders as readable HTML instead of raw grid; Flow Run Input field read-only, Output trimmed on display.
Show failed tool calls in activity timeline
Surfaces a "Failed" badge on tool calls whose result is an error payload; message shown in dropdown.
Frappe Draw: unified-canvas polish (minimap coverage + library type filter)
Minimap now shows all content (block shapes, whiteboard objects, frames) on unified docs; "Drawing" type added to library filter.
Frappe Draw: in-frame editing (double-click a frame to edit it)
Double-click a mind-map or flowchart frame to enter it; the editor becomes that frame's single-type editor, with keyboard + contextual toolbar; "Back to canvas" bar returns to composed view.
Saturday, July 18
Automatically link portal users to their associated contact profiles for customers and suppliers
Portal users added to a Customer or Supplier now automatically link their existing Contact, making portal-visible records accessible.
Block sales invoice submit when customer overdue exceeds threshold
Opt-in per-customer Overdue Billing Threshold blocks Sales Invoice submit unless the user holds a configured bypass role.
Batch operation batch-size flag lookups to avoid n+1 query in work order
Batches operation batch-size lookups instead of querying per-row for every exploded BOM node.
Add fetch from in production plan material request child table
Adds fetch_from mapping for Production Plan Material Request items.
Strip account number when building account name in COA importer
Chart of Accounts importer strips leading numbers from account names.
Include on hold status in project filters and reports
On hold projects are now filtered correctly in Task/Timesheet selectors and appear in the Project Summary report.
Remove duplicate links from home and projects workspaces
Removes duplicate entries that appeared after workspace re-export in #56864, fixing doubled links in desk.
Fall back to the company in-transit warehouse
`set_transit_warehouse` now falls back to the company's default when the source warehouse has no in-transit default.
Replace column-literal work order filter with server-side query
Stock Entry's work_order link filter now uses a proper server-side query instead of a broken column-literal comparison that silently degraded.
Parallel reposting stalls between scheduler ticks
Enables continuous reposting by enqueueing the next batch immediately instead of stalling between 30-minute scheduler ticks, fixing throughput regression with large backlogs.
Validate buying price list on material request and update item rates on change
Defaults `buying_price_list` only when user has read permission, clears it on validate if not a buying list, and refreshes item rates when the list changes.
Force-delete repost data file during cleanup
Passes `force=True` when deleting attached Files during reposting cleanup so File deletion guard from frappe#40812 doesn't block the operation.
Add missing DF types for controller annotations
Type-annotates Geolocation, Signature, Icon, and Long Int fields.
Add N_ noop for translation extraction
`N_()` marks strings for gettext extraction without translating at call time.
Revoke old token after refreshing
Old token is now revoked after refresh.
Repeater row conditions and merged-column direction toggle
Print-format Repeater rows can now be conditionally shown with a Jinja expression; merged columns support LTR/RTL direction.
Composer — EmailComposer & CommentComposer
Two ready-to-use message composers: EmailComposer with headers/attachments/quoted replies, CommentComposer with @-mentions.
Virtualization
Windowed rendering for 2000+ row lists keeps only visible rows (+ buffer) in the DOM, preserving column widths and bulk selection across scroll/pagination/resize.
Translate description in info card when `show_description_on_click` is set
Info card descriptions are now translated when the toggle is set.
Allowlist print settings overrides to the doctype's print toggles
Caller-supplied print-preview overrides are now restricted to fields the doctype actually exposes.
Use normal exception instead of assert
Replaces assertions with proper exceptions for validation errors.
Fix!: Don't run frappe under optimize flag
Removes `-O` optimize flags which disable assertions without real benefit.
Column resizing in list view and child tables for RTL layouts
Column resizing now works correctly in right-to-left layouts.
Pass parent_doctype when fetching Has Role in Role form tabs
Passes `parent_doctype` to `frappe.db.get_list("Has Role", ...)` in Role form tabs, fixing "Insufficient Permission" errors for non-Administrators.
Sync comment cache on relink
Syncs comment cache on both old and new parents when relinking, fixing comment count mismatches on relayed Communications.
Blank columns when field is not in_list_view
Fetches configured columns that aren't in the default in_list_view set, waits for that before refresh so link titles don't lag.
Workspace save fails when adding a new chart or widget
Uses `frappe.parse_json()` in `save_new_widget` instead of re-parsing already-parsed `new_widgets`, fixing TypeError when saving workspace changes.
Schedule interview dialog on job applicant form
"Schedule Interview" dialog collects all details in one place with auto-populated interviewers from Interview Type.
Checkin button no longer defaults to IN while loading
Checkin button stays disabled until the last check-in loads instead of defaulting to IN.
Prefill custom fields in lead to deal conversion form
Lead-to-deal conversion now pre-fills custom fields alongside default fields.
Sitemap seeding and extraction fixes
Crawl queue seeded from site sitemaps; also fixes extraction and follows nested sitemapindex files.
Capture feature adoption using pulse
Telemetry events track adoption of web forms, domain enrichment, and ERPNext integration features.
Refactor ERPNext product sync settings
Splits ERPNext product sync into two directions: Items always pull into CRM Products, pushing back is now opt-in via "Bidirectional Product Sync" toggle; adds Manual Sync button and sync logs.
Create product in CRM if opted out of bi-directional sync
Respects bidirectional product sync opt-out and doesn't redirect to ERPNext to create items.
Onboarding persona questionnaire
New admins see a one-time stepper collecting org name, team size, tooling, challenges, and goals; answers sent to telemetry.
Strip html comments from agent reply email content
Removes MSO conditional comments and other HTML comments from email replies before sending so markdown2 doesn't break them.
Make headers sticky in TicketsTab
Column headers in the Tickets Tab of Customer and Contact pages stay fixed when scrolling.
Dim images by default in dark mode
Images without dark variants now apply subtle default dim (brightness 0.85, contrast 1.05) in dark mode.
Added per-corner control for spacing and border-radius
Split/uniform inputs for spacing and border-radius now allow per-corner control with label dragging.
Add quickstart page for new onboarders
New onboarders with ≤3 sites see a quickstart page after login.
Report public server pool health
Hourly job monitors public primary servers, fetches Prometheus metrics in bulk, chooses best server per cluster, and reports health via Raven.
Structured -F values (key:=json), fix GET --input
`-F key:=json` now parses JSON values; fixes `GET --input`.
Drop the "mutations run without confirmation" tip
Removes misleading guide text about mutations.
Let user know we are waiting for cache fill
User-facing message when waiting for cache fill.
Replace whole roles field instead of patching union discriminator
Stalwart account role assignment now patches the whole roles field instead of sub-paths.
Show plain-English intent for execute tool confirmations
Execute tool approval card now shows one-line `description` of intent as title with code below.
Add Frappe server-tests job
Adds Python doctype test gating to Draw CI.
Canvas unification — Phase 3b: remove type selector, land on canvas
New diagrams are unified canvas by default; type selector removed and users land on blank editor immediately.
Canvas unification — Phase 4a: frame origin data model
Unified documents add `origin` {x,y} to mind maps and flowcharts; legacy single-type docs unaffected.
Canvas unification — Phase 4b: render mind map & flowchart as frames
Mind maps and flowcharts render as positioned frames on the unified canvas alongside block shapes and whiteboard ink.
Canvas unification — Phase 4d: Templates/Insert menu for frames
Insert menu adds starter mind maps or flowcharts to the unified canvas.
Canvas unification — Phase 4c: select & move frames
Mind map and flowchart frames are now first-class selectable/draggable objects on the unified canvas.
Frappe Draw: Writer-style diagram sharing (view/comment/edit) — backend
Diagram sharing built on Frappe core DocShare + custom "comment" permission type, no Drive dependency.
Frappe Draw: Share dialog UI wired to sharing backend (view/comment/edit)
Share dialog now wired to `draw.api.share.*`, adds comment-level access, and user-search endpoint for invites.
Frappe Draw: optional Frappe Drive integration (register diagram as a Drive file)
Diagrams can be registered as Frappe Drive native documents; soft-coupled with no Drive dependency.
Template library: 17 new template groups
Grows template catalog from 11 to 27 groups across Fashion, Portfolio, Technology, and Marketing.
Scope screening backfill to active, configured, fetching users
Screening patch now targets a precise set of active users with JMAP configured, avoiding redundant backfill.
Enable screening by default for new accounts
New JMAP Accounts start with screening enabled instead of requiring manual opt-in.
Collapse consecutive mails from the same sender in list view
3+ adjacent threads from one sender on one day render as a single expandable row, reducing list clutter (measured: 300 threads fold to 19 stacks).
Local email-address suggestions (Tantivy)
Local per-account full-text index powers email-address suggestions from cached messages and contacts without JMAP round-trip.
Protected cell ranges and sheet lock
Protected ranges and whole-sheet lock enforced across all write paths; ranges shift correctly on row/col insert/delete.
Lossless XLSX import/export
XLSX round-trip now preserves formulas, number formats, merges, and all sheets; replaces string-only bridge.
Threaded, resolvable cell comments
Cell comments turn into threaded discussions with resolve/reopen, @-mentions, and timestamps.
In-cell SPARKLINE mini-charts
`SPARKLINE(data_range, [type], [color])` formula renders line or column mini-charts in cells, inheriting recompute-on-change from the formula engine.
Editor layout, comments & read-only selection; drive dialog fixes
Unified editor scrolling, permanent comment gutter, restored text selection in read-only, and dialog fixes.
Flexible comment layout with chips and mobile support
Writer comments now use a symmetric grid with mobile-responsive chips and bottom sheet.
Fix move toast and move-dialog button state
Move operation now shows correct filename in toast and button state works when moving within same team.
Consistent empty states across pages
Unified empty-state rendering and copy across Attachments, Notifications, and other Drive pages.
Cancel error on loan security assignment when loan value is empty
Cancel no longer crashes when loan amount is None.
Keep execute description required so the model always supplies intent
Reverts default on execute tool description so the model always supplies intent text.
Make Flow installable on Frappe Cloud and v16
Adds `[tool.bench.frappe-dependencies]` and pins litellm to support Python 3.14 and Frappe v16.
Preserve custom keys in common_site_config.json
`write_common_site_config()` now merges over existing file instead of replacing it, preserving keys added via `bench set-config`.
Friday, July 17
Automatically link portal users to associated contact profiles for customers and suppliers
Automatically detects and links existing Contact records when portal users are added to Customers/Suppliers.
Book Expenses Added To Stock GL entries for stock vouchers
Books GL entries for expenses added to stock value movement, mirroring Purchase Expense pattern and making the feature configurable.
Map settings for DocTypes to show on settings dialog
Maps DocType settings to display in the DocType settings dialog General tab.
Consider min order qty in the purchase/transfer flow of production plan
Ensures minimum order quantity is respected when splitting purchase and transfer allocations in production planning.
Serialize postgres stock writes per (item, warehouse)
Adds transaction-scoped advisory locking for concurrent stock writes in postgres to prevent serialization failures and incorrect inventory.
New control "Attachment Gallery"
Adds standard form control for viewing, uploading, previewing, and deleting attachments with optional filtering.
Translate description in info card when show_description_on_click is set
Translates field descriptions in info cards when show_description_on_click is enabled.
Center the close button
Centers the close button in modal headers for better visual alignment.
Independent table style controls in print format builder
Decouples table style controls so Style controls only lines/stripes, Bordered controls column lines, and header controls header row independently.
Report why chromium failed to start instead of a blanket timeout
Reports actual Chromium startup failures instead of generic timeout message, improving CI debugging.
Honour print settings pdf generator for standard printing
Respects Print Settings > PDF Generator selection for standard printing instead of forcing Chromium, allowing wkhtmltopdf fallback.
Truncate MultiSelectList status text within the control box
Truncates long selected labels in MultiSelectList controls to fit within the component instead of overflowing.
Batch child-table fetch in data export
Batches child-table fetches during data export to improve performance and reduce database queries.
Render Markdown Editor standard filters as text search
Renders Markdown Editor standard filters as text search instead of complex filter UI.
Duplicate intro messages on first save of a new document
Fixes frm.set_intro() appending duplicate messages on first save by clearing previous message instead of always appending.
Guard against missing old_doc in validate_snapshot_reports
Adds guard to prevent AttributeError when System Settings is inserted fresh with no prior document to compare.
Various issues in sidebar
Addresses multiple sidebar UI issues including button centering and alignment.
Don't emit column fieldname as a CSS class
Prevents column fieldnames from being emitted as CSS classes, which could cause unintended styling or DOM pollution.
Do not translate empty string
Prevents translation of empty strings which was causing issues with gettext extraction.
Add a perm. chk for ref. document to update_reference method
Adds permission check for referenced documents to update_reference method, closing Ticket 72600.
Field inspector label and align/spacing conflict in print format builder
Shows field's real doctype label in inspector instead of custom print label; resolves Align/Spacing control conflict where Spacing silently overwrote Align.
Hide submit button for non-submittable documents
Removes the submit button from form toolbar for non-submittable doctypes, preventing UI confusion.
Escape template context values before rendering
Escapes template context values to prevent XSS in dynamic template rendering.
Escape list filter values before rendering
Escapes list filter values before rendering to prevent XSS through filter UI.
Allow safe tags only in discussion reply md
Restricts HTML tags in discussion replies to a safe allowlist, blocking XSS.
Escape script context values before rendering
Escapes script context values in form rendering to prevent XSS attacks.
Capture HR product usage & activation telemetry
Adds anonymous site-scoped telemetry to measure HR feature usage and post-install activation funnel.
Schedule interview dialog on job applicant form
Replaces broken "Create Interview" button with "Schedule Interview" dialog that collects all details and creates the interview directly.
Show Holiday List Assignment in Employee connections tab
Adds Holiday List Assignment to Employee document's Connections tab so HR users can see assigned holiday lists without navigating away.
Builder UI polish + settings consistency
Polishes Forms builder UI to match SLA/Assignment Rule settings pages and fixes minor UX issues.
Add fields to store Raven keys in Press Settings
Adds fields to Press Settings for storing Raven keys.
Fix conflict, plans section fields got added twice
Fixes press_settings.json conflict where plans section fields were duplicated.
Match correct column name to avoid null
Fixes column name mismatch in signup flow that was causing null errors.
Misc features
Adds method call verb, drops confirmation prompts, improves default behavior and debug hints.
Remove claude's system prompt in assistant mode
Removes Claude system prompt from frappectl assistant mode.
Add frappe-ui molecules directory to tailwind content glob
Adds frappe-ui molecules to Tailwind content glob so utility classes are generated.
Remember selected panels & open file in editor
Persists selected panels and open file in Studio editor across page refresh.
Roll back failed and cancelled app/site tasks via callbacks
Extends task manager callbacks so failed or cancelled tasks roll back to clean state instead of leaving orphans.
Billing invariant audit
Adds billing invariant violations report that surfaces rows with inconsistent team/amount pairs for audit verification.
Add "Filter messages like this" action
Adds "Filter Messages Like This" action to message more-actions menu to scope mailbox to sender, matching Gmail's feature.
Read-only mode for view-only access
Surfaces write permission at load time and renders proper read-only mode for view-only access instead of misleading editable UI.
Outline the active filter's range on the grid
Draws Google-Sheets-style outline around active filter's rectangle to visually indicate which cells are filtered.
The core ↔ service boundary — VMService seam + satellite
Lands phase 0 of core/service boundary: Atlas core keeps VM existence; service-specific logic attaches via explicit registry.
Add filesystem path tab completion
Adds filesystem path tab completion for bench commands like restore, backup, and data-import.
XLOOKUP, in-cell parameter help, and warn-severity validation
Adds XLOOKUP function with exact/next-larger/next-smaller modes, in-cell parameter hints, and validation with warning severity.
Custom Excel-style number formats
Adds custom number format type allowing Excel-style format codes beyond built-in presets with interpreter covering common codes.
Web Application Firewall
Implements web application firewall functionality for Pilot.
Canvas unification — Phase 3a: unified toolbar + drawable whiteboard
Makes unified canvas fully drawable by showing both block creation and whiteboard annotation tools in bottom palette with shared tool namespace.
Canvas unification — Phase 2b: simultaneous block + whiteboard rendering
First visible step of canvas unification: renders shared block substrate and whiteboard layer together so shapes and ink coexist on one canvas.
Canvas unification — Phase 2a: tool-keyed interaction dispatcher
Converts surface interaction registration from single-slot ref into layer-keyed registry resolved by active tool.
Canvas unification — Phase 1: unified-document data model
Introduces unified data model for all diagram types (blocks, shapes, whiteboard ink, stickies) as first phase of canvas unification.
Re-parse a released source instead of serving it from cache
Repurses FileTallySource after release instead of serving stale cache, fixing buffer reuse bugs on re-runs in same worker.
Don't nest stale params into contact search filter
Fixes malformed JMAP filter in contact autocomplete where search text was being replaced by stale params object.
Mount FrappeUIProvider in slides shell
Mounts FrappeUIProvider in slides shell and migrates deprecated toast.create calls to new toast API.
Don't apply hover bg when row is fully overridden via slot
Prevents tree component from applying default hover background when row content is fully customized via slot.
Cap stored attachment text to avoid exceeding max_allowed_packet
Caps attachment text storage to inline-injection threshold while preserving full text in memory for retrieval and embedding.
Wrap inline images in multipart/related
Restructures MIME message layout to wrap inline images in multipart/related, resolving AWS Trust & Safety rejection of mail replies.
Credits negative balance
Fixes currency-blind credit anchor that allowed per-currency balances to go negative while the guard approved debits.
Thursday, July 16
Add on hold status to project
New Project status for temporarily pausing a project without marking it cancelled.
Name every conflicting voucher in the reserved batch error
Reserved Batch Conflict error named only the first conflicting voucher; now lists every voucher with an outstanding claim.
Allow delivery when a batch is reserved across multiple sales orders
Delivering one order's own reserved batch unit threw Reserved Batch Conflict when another order's reservation exactly matched the remainder; now aggregates outstanding reserved qty across all orders.
Set correct currency in supplier quotation net rate field
Supplier quotation net rate field used the wrong currency context, showing values in the wrong denomination.
Hide job card field in purchase order item
fix: hide job card field in purchase order item
Validate mandatory date filters in reports
Dashboard charts on reports lacking mandatory date filters raised TypeError instead of displaying a user-friendly validation message.
Apply user permissions via build_match_conditions
`sales_person_wise_transaction_summary` report broke after backport #56429; rebuilt filters using plain dicts and `build_match_conditions` for compatibility.
Skip redundant reposting of dependent items
Cascading reposting of dependent items after a backdated entry caused items to repost multiple times if they had their own queued repost records.
Preserve UI sorting in report view export
Report export now preserves the sort order from the UI by passing visible column indices to the backend.
Barcode scanner enhancements
Added flashlight toggle, zoom in/out, and keep-scanner-open options for mobile barcode scanning.
Feat!: move classic print formats to the new builder and remove the classic builder
Default printing now renders via the beta Chromium-based builder; classic layouts auto-convert on migrate with reversibility via `classic_format_data`.
Center selected-icon with input text
fix(icon-field): center selected-icon with input text
Don't crash query validation on large generated queries
Query validation crashed on large `IN (...)` filters exceeding sqlparse's `MAX_GROUPING_TOKENS` cap; now raises a clearer error.
Evaluate creation-based SQL cutoffs against the system timezone clock
Raw SQL queries compared timestamps against `NOW()` in DB timezone instead of system timezone, causing mismatches when the two differed.
Batch name lookups in get_data_for_custom_field
Custom report link columns with thousands of values exceeded sqlparse's token limit, crashing with SQLParseError; now batches lookups per 1000 names instead of one query per list.
Skip push notification config fetch without relay
Every HRMS PWA tried to fetch the notification relay config even when unconfigured (common on self-hosted instances), raising an error.
Quote from_date and to_date to resolve reserved word errors
MariaDB 12.3+ treats `to_date` and `from_date` as reserved words, causing 1064 Syntax Errors in raw SQL queries; now backtick-quoted.
Default amount incorrectly prorated in formula-based components
Default component amounts were incorrectly recalculated using payment days instead of total working days when LWP or absences affected payment days.
Cancelled Shift Assignments silently block new shift creation via Roster API
Cancelled shifts kept their `status = 'Active'`, so the adjacency filter still matched them, blocking new shifts; now updates status on cancel.
Half-yearly earned leave schedule for joining date based assignments
Half-yearly leave allocation calculated period boundaries against the calendar year instead of the employee's actual joining date.
Web Form Builder in Frontend
Built-in form builder for CRM to create public forms that collect leads and deals directly from websites, with visual builder, field selection, and automation.
Normalize user names for mentions
Mentions in comments broke in prod builds due to missing username normalization.
Ticket SLA policy application
Enabled SLAs with a blank condition matched every ticket, silently overriding the default SLA.
Add 'how did you hear about us' question
feat(persona): add 'how did you hear about us' question
Don't send null docname on lesson file upload
File uploads on unsaved lessons failed with HTTP 417; now uploads as standalone files until the lesson is saved.
Stop fetching the outline before the course loads
Course outline fetch fired before course name was available, returning 500 and never retrying; now uses a watcher that fetches only once course data loads.
Miscellaneous fixes across payments, jobs, assignments, batches, and editor
Fixed 7 bugs: payment gateway validation, applicant count sync, assignment deadline, batch creation, and lesson editor field visibility.
Rebuild sales quotation funnel with builder ops
Only raw-SQL query across shipped templates; rebuilt as 100% builder-native ops mirroring existing accounting patterns.
Re-base accounting AR/AP on Payment Ledger Entry
AR/AP Open Invoices queries scanned unbounded GL Entry (tens of millions of rows); rebased on smaller Payment Ledger Entry.
Lower default query timeout to 60s
Interactive query timeout reduced from 180s to 60s to prevent stalled workers and unnecessary OLTP load; timeout now routes through a single helper.
Nudge Insights Admins to prebuilt module dashboards
Dismissible banner in ERPNext module workspaces (Selling, Buying, Stock, Financial Reports) linking Insights Admins to prebuilt dashboards for each module.
Allow multiple selection for apps removal in benches page
feat(ui): Allow multiple selection for apps removal in benches page
Check the public ip address field instead of check box
fix(sync): Check the public ip address field instead of check box
Repair resize tests for the host memory reserve + satisfy pinned ruff
Greened failing Server and Frappe Linter CI jobs after placement's host memory reserve change; fixed resize capacity tests and ruff violations.
Clarify external vs pilot-managed DB in setup wizard
Root password field now describes three cases (fresh, pilot-managed, external); prefills host/port for external databases.
Connect setup wizard to an external database server
Optional toggle to connect to external database (RDS, etc.) instead of spawning a pilot-owned MariaDB/PostgreSQL; explicit stored choice with prefilled defaults.
Show repeater icon on a repeater/repeated block to visually identify them
feat: show repeater icon on a repeater/repeated block to visually identify them
Show tool calls immediately while streaming
Tool cards appear immediately mid-stream with the call name, then re-emit with full arguments once they finish streaming.
Redesign marketplace page
Visual redesign with category pills (7 buckets from registry), "Works with" filter for Frappe-made apps, import button in filter row, and grid improvements.
Archive shortcuts + optimistic theme cycling & undo-toast cleanup
Added `G` then `A` shortcut to Archive mailbox and documented both Archive shortcuts; plus optimistic theme cycling and undo-toast cleanup.
Search across accounts
Opt-in toggle to search across all JMAP accounts the user owns, with results merged newest-first.
Search filter chips, quick filters & inline editing
Mail search UX overhaul with redesigned results header, active-filter chips, inline operator autocomplete (for folders, contacts), and quick-filter bar.
RS256/JWKS trust anchor + bootstrap-token enrollment
Central mints a single RSA signing key for JWT tokens benches trust, with a JWKS endpoint and bootstrap-token enrollment flow.
Get app validations
Refactored app validator into a pluggable package with checks for repo structure, syntax, dependency declarations, and static import resolution.
Managed add on services
Adds Services module to Central for team-level add-ons, starting with LLM Hosting (Grove-backed) with catalogue, entitlements, credentials, and billing.
Raise toast z-index above sticky columns
fix: raise toast z-index above sticky columns
Allow deleting Flow Model despite Session/Agent references
Sessions and Agents held historical links to Flow Models, blocking deletion; added them to `ignore_links_on_delete`.
Wednesday, July 15
Batch BOM source warehouse lookup in get_production_items to avoid N+1
Fetches all BOM source warehouses in a single query instead of one per Production Plan item row.
Make naming series based on posting datetime on by default on new sites
New ERPNext v17 sites now have posting-datetime-based naming series enabled by default.
Company-wise restriction for Item, Customer and Supplier masters
Item, Customer, and Supplier now support company-wise restriction; masters are hidden from users limited by Company User Permissions when feature is enabled.
Duplicate scorecard period when supplier is created on a month end
Supplier scorecards created on month-end dates no longer generate duplicate periods.
Prevent duplicate material request items in purchase order
Purchase Orders created from Material Requests now allow the same item in multiple rows with different rates, matching Sales Order from Quotation behavior.
Preserve job card transferred quantity
Job card quantity is now preserved during transfer operations.
Set stock_uom on transferred Stock Reservation Entries
Transferred Stock Reservation entries now correctly copy stock_uom, preventing silent UOM mismatches on items with non-default stock UOMs.
Added permission checks on `get_account_balances_coa`
Adds missing permission enforcement to Chart of Accounts balance endpoint.
Workspace rail
Adds workspace dock on the sidebar for displaying and navigating workspaces.
Add Letter Head to Printing workspace sidebar
Letter Head doctype now appears in the Printing workspace sidebar.
Bump phonenumbers to ~=9.0.23
Upgrades phonenumbers library to correctly validate Saudi Arabia phone numbers with widened mobile pattern.
Ignore not nullable and v15 specific module fetching
Fixes database column handling and v15-specific report module fetching logic.
Consider ownership check & perms. when using dot notation
Database queries using dot notation now properly enforce ownership and permission checks.
Allow child tables to be used in dashboard charts
Chart Dashboards on child doctypes are now accessible to users with appropriate permissions.
Preserve ui sort order for query report
Query reports now preserve user-set sort order instead of resetting to default.
Update category retrieval to use `form_dict` pathname
Help article categories are now correctly retrieved when accessed via URL routing.
Guard against invalid navigator.language in alt shortcuts
Alt shortcut initialization no longer crashes when browsers return invalid BCP-47 language tags.
Restore telemetry via boot_config + track library adoption
Telemetry now works via boot_config pulse client, independent of frappe-ui v1 migration.
Workbook template updates via version + checksum
Workbook templates can now update in-place from the library; pristine copies auto-update on migrate, edited copies get warned manual updates.
Deploy Wazuh
Adds Wazuh security monitoring deployment to Press servers.
Add support for freemium plan
Site plans now support lifetime free subscriptions via negative trial days in product trials.
Infinite scroll for All Inboxes
All Inboxes view now uses infinite scroll instead of offset pagination with collapsible date groups.
Add find-doc-save-hooks.sh
Utility script surfaces app-side document save hooks that impact performance.
Load-aware host selection (part 1) for the proportional size ladder
VM placement now scores feasible Active hosts under operator-chosen strategies (Spread by default) and selects the best.
Optimistic UI for thread & message actions
Mail actions (archive, trash, star, read, move, etc.) now update UI before server confirms, with automatic rollback on failure.
Backup retention management and audit logging
Adds backup retention policies and audit logging for backup management operations.
Template categories, responsive layout fixes, and catalog cleanup
Template picker now organizes templates into four categories (Marketing, Portfolio, Editorial, Local Business) with responsive improvements.
Select & edit multiple blocks
Multiple blocks can now be selected with Shift+Click (range) or Cmd/Ctrl+Click (toggle) and edited together if same component type.
Set Route Variables for editing/testing dynamic route pages
Studio now allows setting route variables for testing dynamic pages, replacing non-deterministic first-document fallback.
Note server scripts requirement for script tools and conditions
Adds documentation that Flow script tools and conditions require `server_script_enabled`.
Sandboxed trigger conditions and a Run As identity
Flow trigger conditions now run in server-script sandbox (multi-line scripts with result variable) and triggers can run as a specified identity.
Back up VM snapshots to S3 and restore them
Adds off-host durability for VM snapshots via point-in-time S3 backup/restore, supporting both cold (disk) and warm (memory + signature) snapshots for clone rehydration.
Install base packages on macOS via Homebrew too
macOS now installs base tools, databases, and Node through Homebrew with proper sudo prompting and download validation.
Bench new picks a MariaDB port macOS will never actually bind to
Bench new on macOS no longer picks custom MariaDB ports that Homebrew won't use.
MacOS is_provisioned() always False, silently resetting a secured DB password
Database provisioning checks on macOS now work correctly, preventing silent password resets on second bench init.
Fail the bake loud when the freshen unit isn't live at capture
VM snapshot bake now fails loudly if freshen unit isn't alive, preventing silent guest reachability issues.
Cap old-order sync at 31 inclusive days with precise day bounds and tests
Old order sync respects Unicommerce's 31-day search limit with precise day boundaries and client-side validation.
Restore screen share after recovery
Screen sharing is now restored after video meeting recovery.
Route reconnect lifecycle events
Media reconnection events are now correctly routed after connection recovery.
Bound SFU request acknowledgements
Prevents unbounded SFU request acknowledgement queues in video meetings.
Recover media after signaling and ICE failures
Video meetings now independently recover transports after signaling and ICE failures, resync participants, and preserve E2EE state.
Tuesday, July 14
Using get_cached_doc to retrieve template for get_terms_and_conditions
fix(tnc): using get_cached_doc to retrieve template for get_terms_and_conditions
Preserve job card transferred quantity
Work Orders with multiple Job Cards showed incorrect quantity in progress by adding quantities from every card instead of using the final effective quantity.
Restrict jinja globals in process statement of accounts templates
fix: restrict jinja globals in process statement of accounts templates
Match quoted and unquoted sort/group references to child tables
fix: match quoted and unquoted sort/group references to child tables
Discover methods
API discovery now includes controller methods alongside RPC methods with tagged union to distinguish.
Retry failed deliveries on a backoff schedule
Webhook retries now use separate background jobs with increasing backoff instead of sleeping in same job; prevents worker blocking.
Virtualization and pagination in kanban board
Kanban board now virtualizes and paginates instead of loading all documents at once; solves initial load slowness and freeze on scroll for large datasets.
Add SafeDoc class
SafeDoc class extends _dict with internal Document methods for safer eval contexts.
UX misleading as there is no cap in backend
fix(email_report): UX misleading as there is no cap in backend
Warn and auto-clear disabled default print format
Disabling a default Print Format left it silent and confusing; now warns via confirm and auto-clears on save.
Prevent child row identity corruption on sync after reorder
Child table rows could become misaligned after save if backend reordered or removed rows; reconciliation now matches by document name instead of array index.
Avoid false matching custom queue name with default ones
Custom queue named `schedulelong` would false-match under `queue=long` via endswith check; switched to exact match.
Password strength check fails on long random passwords
Pasting long passwords (like manager-generated ones) caused 500 error because error response itself failed to serialize.
List toolbar keeps mobile layout after the viewport gets wider
Layout decision was made once at construction time; resizing window or rotating phone left toolbar stuck in original layout.
Don't block logged-in users from commenting
Bad conflict resolution in backport kept guest-only anti-spoof check in logged-in branch; every logged-in comment was incorrectly rejected with "Please login".
Validate HTTP method for document calls
fix(api): validate HTTP method for document calls
Data Enrichment for CRM Lead, Deal and Organization
First-party domain enrichment; crawls company website and extracts structured facts (JSON-LD, Open Graph, meta tags) to enrich CRM records without third-party APIs.
Customer portal permission banner
Dialog to revert end users to access each other's tickets.
Gate local payment tabs behind role permission
feat(partner): Gate local payment tabs behind role permission
Improve partner onboarding
Added approved_on field, company logo upload, link to Frappe School batches, sales contact in sidebar.
Pull @framework/ui components and upgrade frappe-ui to beta 24
feat: pull @framework/ui components and upgrade frappe-ui to beta 24
Add categories to template group manifests and catalog
Templates can now belong to multiple categories (e.g. Portfolio + Marketing) passed through in catalog for consumer filtering.
Declare Frappe Cloud version compatibility
Added [tool.bench.frappe-dependencies] to pyproject.toml so Frappe Cloud validates app compatibility during installs/updates.
Support Debian, Fedora and Arch alongside Ubuntu and Alpine
Installer now detects distro from /etc/os-release and uses per-distro package primitives (apt/dnf/pacman/xbps/apk).
JWKS-based remote session login
Central can mint tokens for bench login and generate site-login SID via dummy JWKS server.
Gate multi-bench UI/API behind admin.allow_bench_management
feat: Gate multi-bench UI/API behind admin.allow_bench_management
Trusted-proxy nginx gating and local domain validation
fix: trusted-proxy nginx gating and local domain validation
Discover and invoke doctype methods
Extends API discovery to include controller methods; frappectl method list/search now cover new surface.
Protect system-generated rows
Lets apps ship builtin knowledge and system rows managed via migrate-time sync without users breaking them from the Desk.
Stop response
Stop button while response streams to abort and finalize run; deny tool-approval now ends turn instead of continuing.
Import & Export Contacts (JMAP + .vcf)
Submittable Contacts Exchange DocType for background import/export with jmap (round-trippable JSContact) and .vcf (vCard 4.0) formats.
All Inboxes — unified inbox across all accounts
Merges Inbox of every linked account into single newest-first list for viewing personal and shared accounts together.
Replace mailbox pagination with infinite scroll
Next batch appends as you scroll instead of refetching 25-row pages; already-loaded rows never re-fetched.
Preserve party contacts and addresses on dirty phone / GSTIN data
Invalid phone fields and GSTIN state code mismatches were silently losing party email/name on import; now salvaged with validation.
Monday, July 13
Make represents company field in purchase invoice ignore user pe…
fix: make represents company field in purchase invoice ignore user pe…
Allow asset repair creation for fully depreciated assets
Removed restriction preventing asset repairs on fully depreciated assets to allow expense tracking for still-active assets.
Propagate project from job card to stock entry
Added missing project field copy from job card to stock entry in pick list workflow.
Link job card in stock entry created from pick list
Stock entries created from pick lists against job card material requests now properly set job_card, job_card_item, and fg_completed_qty so the job card recognizes the transfer.
Accounting dimension search matching unrelated records
Fixed search matching for check-type dimension fields (e.g., Cost Center) that incorrectly matched unrelated records due to type coercion on non-numeric input.
Zone divider polish, inline title row, drag-resize table columns
Print format builder improvements: zone dividers now show as light-gray labels with "repeats on all pages" hints; inspector controls are inline; table columns support drag-to-resize.
Empty state component
New standard empty state component for list views, dashboards, and reports; replaces duplicate implementations in embedded lists and DocType settings.
Component library
Added a new component library to Frappe Framework with accessibility and security baked in, matching the Espresso design system; includes a Component Explorer page for viewing all variations and sample code.
Fold table colour controls into the style section
Moved table header/border color pickers into Style section alongside field controls; fixed label alignment issues.
Pixel parity between builder canvas and print output
Converted stylesheet spacing from rem to compensated em to match builder canvas rendering against wkhtmltopdf and Chrome output.
Close color picker on outside click and swatch pick
Color picker popovers now properly close on outside clicks and swatch selection; consolidated duplicate color-control mount logic.
Render rating stars from fraction values
Fixed rating field rendering in print builder; values stored as 0-1 fractions now correctly scale to star counts per field options instead of crashing.
Postgres GroupingError when filtering list views by child-table fields
Fixed postgres query generation when filtering by child-table fields with linked reference titles; now properly aggregates or includes link-table columns in GROUP BY.
Correct DocType casing in read tool label
fix: correct DocType casing in read tool label
App validation
Pre-install app validations to ensure internal and external imports are accounted for and directory structure is correct.
Sunday, July 12
Explain FIFO allocation of fixed Discount Amount on Sales Order
Add an informational description to the Additional Discount Amount field explaining how fixed discounts behave across multiple deliveries and invoices.
Allow negative balance in bank statement import
Accept negative opening balances during bank statement imports.
Update events order by date ascending
Sort Lead activities by due date instead of arbitrary order.
Render columnar financial statements
Display data in the Horizontal Balance Sheet columnar report template instead of showing empty results.
Read user permissions from current session user in payment reconciliation
Refresh user permission filters at reconciliation time instead of capturing them at document creation, fixing filters when the session user changes.
Map stock_qty in apply_price_list_on_item
Convert transaction quantity to stock quantity before evaluating Pricing Rules when items use alternative UOMs, preventing quantity-band rules from being inconsistently applied.
Remove incorrect Payable account_type from Customer Deposits in Philippines CoA
Fix non-deterministic default payable account selection caused by duplicate account_type in the Philippines Chart of Accounts template.
Print format builder colour styling + copy/paste
Add colour styling for table headers/borders and field text, plus copy/paste support for fields and sections in the print format builder.
Min_value and max_value properties for numeric fields
Allow Int, Float, Currency, and Percent fields to declare validation bounds in DocType and Customize Form, with validation running on save.
Auto-assignment fails to follow document when triggered by web user
Apply ignore_permissions when creating follow entries during auto-assignment from web user submissions.
Print format builder table + preview fixes
Center serial-number columns, round section backgrounds in print output, and keep preview document selection in sync.
Assign to filter fails with type validation error on strict stacks
Accept current_filters as either string or list to fix type validation when toggling the Group By dropdown in the Assign To filter.
Return consistent request ID
Return a consistent request ID to allow tools to query recordings easily.
"Show all activity" toggle showing white when enabled
Fix toggle appearance when the "Show all activity" filter is enabled.
Duration picker opens away from the field in scrolled grids
Position the duration picker using viewport coordinates and keep it anchored while scrolling or resizing.
Re-evaluate link_filters per search without breaking doc-based get_query
Fix crashes when Link fields have both Customize Form filters and programmatic set_query reading the document.
Guard against None table field in load_doc_before_save
Default to an empty list when child table fields are None to prevent TypeError during pre-save processing.
Clear if_owner on permission rows above level 0
Validate and clear if_owner flags on higher permission levels where they are ignored, aligning stored permissions with framework behavior.
Translations not applied in background jobs
Set frappe.local.lang after initializing the job user so translations use the job user's language instead of the site default.
Harden DCR and cleanup OAuth authorization UI
Improve OAuth Device Code Request security and align UI with design standards.
Add egress URL validation for server-side fetches
Validate egress URLs for server-side fetches to prevent SSRF attacks.
Remove root redirect from website redirects
Stop redirecting the root path to allow users to set their default home URL.
Don't override favicon for mail and calendar
Preserve app-specific favicons instead of overriding them globally.
Don't reload on switching apps
Stop reloading the page when switching between suite apps.
Bump reka-ui to 2.9.9 so dialog inputs focus on mouse click
Upgrade reka-ui to fix a regression where dialog overlays suppressed focus on mouse clicks to inputs and contenteditable regions.
Saturday, July 11
Correct stock ageing value for moving average and lifo items
Stock Ageing report values are now correct for Moving Average and LIFO valuation methods; each remaining slot is revalued to qty × current rate.
Pick list serial batch posting date
Pick list serial/batch handling during posting now correctly applies posting dates.
Pick list serial batch posting date
Pick list serial/batch posting dates are now handled correctly.
Validate planned end date is not before planned start date in wo…
Work Order now validates that planned end date is not before planned start date.
Make trend report based-on and group-by column labels translatable
Trend report column labels for based-on and group-by are now translatable.
Link job card in stock entry created from pick list
Stock Entries created from Pick Lists against Job Card Material Requests now properly set job_card and related fields, so the Job Card recognizes the material transfer.
Fetch payment entry reference amounts from invoice
Payment Entry created from a Payment Request now correctly shows the full invoice amount in the Payment References table instead of only the paid amount from the request.
Add generic utilities for styling and layout
Added generic utility classes for styling and layout based on the Espresso design system.
Add hook to allow drive to overwrite file perms
Added hook to allow Drive to override File permissions independent of Framework defaults.
Expose source code over discovery API
Framework now exposes source code over the discovery API.
Collapsible section collapses while typing in a child table row form
Editing a field in a collapsible section of a grid row was causing the section to collapse; now preserves expansion state during refresh.
Child table header background/radius scoped to row, not cells
Child table header styling now applies to the row instead of individual cells, enabling proper border radius on a rounded container.
Contrast on custom HTML sidebar field in print format builder
Print format builder custom HTML sidebar field now has proper contrast in dark mode.
Dashboard quick list check filter drops "= No"
Dashboard quick list check filters with "= No" were being dropped because standard checkboxes couldn't distinguish unchecked from no-filter; now kept as regular filters.
Bind inline edit to row at edit start, not submit
Report View inline edits were saving to the wrong record if a quick filter changed while editing; now binds to the row captured at edit start.
Scope index subquery to current schema in get_table_co…
MariaDB index metadata lookup was reading from all databases with matching table names instead of just the current schema, breaking multi-site migrations.
Preserve guest-submitted name/email
Guest comments were being overwritten with "Guest" because an anti-spoofing override ran above the guest check; now scoped to logged-in users only.
Don't mutate caller's get_query().filters in MultiSelectDialog
MultiSelectDialog was mutating the caller's shared filters object when reused across searches; now works with immutable filters.
Only allow text in description
Description field now restricts input to plain text only.
Escape computed url in EmbeddedList link column
Escape computed URLs in EmbeddedList link columns to prevent XSS.
Revert "fix: make postgres transactions read committed by default"
Reverted postgres transaction isolation level change.
Use static ?url imports for Leaflet images so the rolldown build can resolve them
Studio build was failing because rolldown couldn't resolve Leaflet image imports; switched to static ?url imports.
Use host name if present when trying to notify users of incoming site archival
Site archival notifications now use the host name when present for better user clarity.
Exclude archived sites' updates from archive block
Bench archival was incorrectly blocked if a site that had been involved in a fatal update was later archived; the guard now excludes archived sites.
Remove duplicate primary btn in CommunicationInfoDialog
Removed visually duplicate primary button from communication info dialog.
Trim guide for agents
CLI guide now focuses exclusively on agent use cases; removed human-centric auth and profile management instructions.
Disable mail account
Users can now disable their mail account; when disabled, an optional Stalwart role from Mail Settings is applied to restrict mail server access.
Launch CLI coding agents wired up for Frappe
Added frappe-cli assistant command to launch CLI coding agents (pi, claude, codex) with Frappe-specific system prompts and site context.
Add self-upgrade command
CLI can now self-upgrade using the original installation backend (uv tool, pipx, pip) with automatic detection of the installer.
Notify when a newer version is available
CLI now passively notifies users when a newer version is available via a one-line stderr nudge, leveraging the existing update command.
Introduce themes for avatar
Avatar component now supports themes with deterministic color assignment by label, defaulting to gray with overrideable options.
Add manual refresh button for new emails
Mail UI now has a manual refresh button for on-demand email fetching instead of waiting for polling.
Route accepted senders to Inbox and let spam fall through screening
Mail screening gate now routes accepted senders straight to Inbox while letting unrecognized mail fall through to server-side spam filtering.
Feat(meet-sfu)!: use `webRtcServer` for minimising port usage
SFU now uses webRtcServer with one port per worker instead of one per transport, dramatically reducing open ports on the server.
Fetch source if available
CLI now fetches source code when available for enhanced introspection.
Add OAuth 2.0 browser login
Added OAuth 2.0 authorization-code + PKCE flow for interactive browser login; access token refreshes automatically and no secret is stored locally.
Dark-mode event colors
Calendar event colors now render correctly in dark mode.
Friday, July 10
Support partial transfer from pick list
Pick list now supports partial transfers with Work Order status updates on each partial completion.
Create material request for raw materials from work order
Work Order form now includes button to create Material Request for raw materials, adding requisition step before transfer.
Confirmation dialog when enabling negative stock on Item
Item-level negative stock toggle now shows same compliance warning as global setting, alerting users to FIFO/valuation implications.
Allow group warehouse for raw material availability in production plan
Production Plan now accepts optional group warehouse for raw material availability checks, allowing stock assessment across sibling warehouses while receiving into leaf warehouse.
Patch moved create_company_custom_fields from pre_model_sync to post_model_sync
Company custom field creation patch moved to post_model_sync for correct execution order.
Match depreciation schedule rows at currency precision to avoid duplicate JEs
Depreciation schedule now matches rows at currency precision instead of exact float equality, preventing duplicate journal entries for assets with many decimal places.
Skip allowed users check when frappe crm is installed locally
CRM sync now handles local CRM installation alongside remote, skipping user allowlist validation and auto-cleaning settings on app install/uninstall.
Revert "refactor(sales_person_wise_transaction_summary)"
Sales Person-wise Transaction Summary reverted to SQL from query builder to fix v15 compatibility (ignore_permissions not supported).
Use company currency instead of global default in report
Trend reports now display company currency symbol instead of global default, fixing symbol mismatches in multi-company environments.
Make trend report column labels translatable
Trend report headers (Item, Item Name, Customer, Currency, etc.) now translatable instead of hardcoded English.
Pick list serial batch posting date
Pick list posting date handling fixed to prevent TypeError and date validation errors in serial/batch operations.
Stock entry handler and transaction controller fixes
Type-hint and module refactors fixed to restore client-side whitelisted method calls for apply_price_list and stock_entry_handler.
Validate planned end date is not before planned start date in work order
Work Order validation now prevents end date before start date.
Rename variant item_code/item_name when attribute abbreviation changes
Item variant codes and names now update when parent attribute abbreviation changes, keeping variants in sync with attribute configuration.
Update BOM operations when routing is changed
BOM operations table now updates when routing is changed on a new version, no longer showing stale operations from original BOM.
Partial delivery note against pick list
Partial deliveries against pick lists now handled correctly.
Surface data import failures in log files
Data import row errors now logged via frappe.logger() for visibility in frappe.log and external log aggregation, complementing Data Import Log.
Basic error analysis
Error analysis UI added for better error visibility and debugging.
Show deferred error insert
Developer experience improvements for error handling.
Postgres Time columns read back with their precision
PostgreSQL Time columns now read back with full precision specification, preventing false type-change detection on every migrate.
Prevent broken pipe from aborting dashboard sync during setup
Dashboard sync now continues if progress stdout fails, making output best-effort instead of aborting setup wizard.
Hide Download Report button without read permission
Download Report button now hidden when user lacks read permission.
Show table field label instead of doctype name in filter dropdown
Child table filters now show parent table label instead of internal doctype name, improving UX discoverability.
Timeline make cards respect full-width toggle
Timeline comment cards now respect full-width toggle setting.
Don't auto-set default on every save, only on create
Letterhead default no longer resets on every save, only on initial creation.
Normalize Check formatter value with cint to prevent 0 rendering as checked
Check field grid cells now normalize string "0" to integer 0 before rendering, preventing false "checked" state in web form grids.
Apply cint to Int fieldtype in format_value
Int columns now consistently formatted with cint on server side, matching client-side formatter and fixing PDF/email report decimal display.
Remove border from filled search bar
Search bar border removed from filled state, eliminating double edge against navbar background.
Queued telemetry events must survive clear_cache()
Telemetry events persisted across cache clear operations.
Dont explode plucked scalars on masked doctypes
Query builder now handles masked doctypes correctly without exploding scalar results.
Allow missing link_filters in validate_fields function
Patch compatibility restored for ≤v14 databases where link_filters column doesn't exist during pre_model_sync.
Child table numeric filters generate invalid postgres query
Nullability checks now performed against resolved child DocType, preventing invalid COALESCE wrapping on PostgreSQL numeric fields.
Xls file import fails with "startswith first arg must be str or a tuple of str, not bytes"
Legacy .xls OLE2 files now preserved as binary, fixing xlrd parsing that failed on text-decoded data.
Code fields show stale value after navigating between documents
Code field editors now repaint when expanded from collapsed sections, fixing display of stale content from previous documents.
Form does not render when form sidebar is disabled
Web Page form rendering fixed when form_sidebar user setting is disabled, preventing TypeError in add_web_link.
Print view is unusable on mobile
Print preview iframe now pinned to actual page width and toolbar repositioned for mobile, preventing content overflow and improving usability.
Notification subject shows "None" when the title field is empty
Notification subjects now use document name fallback instead of literal "None" when configured title field is empty.
Kanban board leaks memory and hangs on repeated re-render
Kanban watchers now properly unsubscribe on re-initialization, preventing memory leak and performance degradation on repeated refreshes.
Restrict print format builder preview to sys. man.
Print format builder API restricted to System Manager role, preventing unauthorized access via preview endpoint.
Link field clears when selected value is outside default options page
Link field values now persist when selected value falls outside default page by injecting value into options and reloading on clear.
Resolve blank employee number and reports_to in Profile
PWA Profile now displays employee_number (when using name-based IDs) and reports_to by bypassing desk-side hiding and permission restrictions.
Implement close warning for job openings and related validation.
Job Opening close now shows confirmation warning if linked Staffing Plan still has unfilled positions, while still allowing close if needed.
Include expense claim line projects in project total expense claim
Project total expense claim calculation now includes expense claim lines linked at the detail level, not just document-level project links.
Show remaining wait time instead of elapsed time for disk resize
Disk resize wait messages now show remaining time (decreasing) instead of elapsed time (increasing), matching user expectations for cooldown UX.
Add Push Subscription tab to Settings
Mail UI Settings now includes Push Subscriptions tab where users can create, view, renew, and delete JMAP subscriptions in bulk.
Show SMTP/IMAP/POP details for third-party clients
Mail Settings now displays SMTP/IMAP/POP configuration for third-party mail clients (Thunderbird, Gmail app), configurable via admin Mail Client Configuration table.
Add push encryption toggle and fix encrypted push decoding
JMAP push encryption now toggleable (unencrypted by default), and encrypted push decoding fixed to handle base64 body with JSON content-type.
Add daily job to renew expiring JMAP push subscriptions
Daily scheduled job now renews JMAP push subscriptions within 3-day expiry threshold, preventing subscription lapse.
Add read-only profiles
CLI profiles now support --read-only flag to restrict operations to GET requests only, preventing accidental writes.
Use indiacator pill for styling status fields
Status field styling now consistent using indicator pill component.
Remove non-standard "Payroll Manager" role from reports
Non-standard "Payroll Manager" role removed from lwf_register, esic_register, bank_mandate_report, and employee_provident_fund_register permissions.
Resolve lock-wait timeouts and cut repost overhead in loan write off and repayment repost
Bulk loan write off and repayment repost operations now execute with batching and async reposting instead of single long transaction, eliminating lock timeouts and reducing runtime from hours.
Resolve avatar/presence user from shared session store
Sheets app avatar now displays correct user initials instead of literal "U" by resolving session from shared store instead of window.frappe.
Relocate email templates to suite app root
Email template loading fixed by relocating templates to app root, restoring frappe.sendmail(template=...) functionality.
Thursday, July 9
Add grouping by dimension functionality in financial reports
Financial reports now support grouping rows by custom dimensions.
Move microbenchmarks to Frappe project
feat: Move microbenchmarks to Frappe project
Add validation for link filters to ensure valid JSON format and structure
Added backend validation for link_filters on fields to ensure valid JSON structure.
Show link filters if fieldtype is Link
Link filters field now appears in Custom Field configuration when fieldtype is Link.
Apply default ordering in v1 & v2 list endpoints
REST list endpoints now apply stable default sort order instead of returning records in undefined order.
Add Verify SSL option for JMAP connection
Added Verify SSL checkbox to Mail Settings for JMAP, enabling local development with self-signed certificates.
Add date-range old-order sync with paginated fetch and duplicate-safe creation
New on-demand backfill job fetches and syncs Unicommerce orders within a date range with pagination and duplicate safety.
Add --debug to trace requests and server SQL
Global `--debug` flag now traces HTTP traffic and server SQL to stderr (with API keys redacted).
Markdown format for useEditor and
Markdown-backed apps (wikis, docs) can now use `format: 'markdown'` with content carried as markdown string.
Default list sort to 'creation desc'
`frappe doc list` now defaults to newest documents first unless otherwise specified.
Map PY state to Puducherry to match ERPNext state list
Unicommerce orders shipping to Puducherry now map to the correct ERPNext state name.
Refresh access token on 401 and retry once so long-running syncs survive token expiry
Long-running Unicommerce sync jobs now refresh expired tokens on HTTP 401 and retry instead of aborting.
Bump `dnspython` to ~=2.6.1 (PYSEC-2026-1307)
fix: bump `dnspython` to ~=2.6.1 (PYSEC-2026-1307)
Wednesday, July 8
Precision issue causing reconciliation error
Fixes floating-point precision errors that blocked account reconciliation. Backported to #56937, #56938.
Validate template and its variant in the same Pricing Rule
Prevents false "Multiple Price Rules exist" error when both a template and its variant are added to the same rule, with a save-time validation block.
Added permission checks on various whitelisted functions
Adds read permission validation to payment entry detail lookups, bank account, and party account whitelisted functions.
Remove unnecessary validation in Release Group doctype
Removes an overly restrictive validation check in Release Group. Backported to #6918.
Add Plan History tab to site detail page
Shows chronological log of all plan changes with plan details, who changed it, and colour-coded change type (Initial/Upgrade/Downgrade).
Add a Subscriptions tab to view the team's subscriptions
Adds consolidated Subscriptions view under Billing, grouped by type (sites, servers, marketplace apps), showing plan and installed-site tracking. Backported to #6915.
Add missing dependent apps to release group
Automatically appends required dependent apps to release groups if missing, preventing manual configuration gaps. Backported to #6916.
Sync app source versions from repo on branch change
Automatically syncs app source versions when branches are switched. Backported to #6920.
Generate preview from HTML body
Enables preview generation from HTML body content in email and calendar exports.
Mail and calendar export
Restores export functionality for mail and calendar items.
Tuesday, July 7
Prefill value from lead while converting to deal
Prefills conversion modal with lead data to reduce data mismatch risk and improve UX.
Agentic ops, Code & Data wiring
feat(AI Integration): Agentic ops, Code & Data wiring
Recipes gallery homepage + frappe-ui design skill
Adds homepage gallery with eight full-page app screens in desktop and mobile variants, live preview/code switcher, and frappe-ui design guidance.
"Open in ChatGPT/Claude" uses wrong page URL after sidebar navigation
Makes AI share link URLs reactive to SPA navigation instead of binding once at render.
Set max sub category or category max amount while declaring exemptions
fix: set max sub category or category max amount while declaring exemptions
Recover from malformed tool-call arguments
Treats invalid JSON in tool-call arguments as an error result instead of crashing the Flow Run, allowing weaker models to retry.
Report dynamically-mandatory fields in read_screen
Reports fields made mandatory at runtime (via toggle_reqd or mandatory_depends_on) by reading live docfield state instead of static metadata.
Don't flag valid third-party links as broken (#575)
Adds User-Agent header to requests and treats 401/403/429 auth wall responses as valid links rather than dead links.
Fix(SendCloud)!: update deprecated endpoint and parcel validations
Updates deprecated SendCloud endpoint and removes strict parcel dimension validation that blocked rate fetch and label creation for carriers with flexible requirements.
Monday, July 6
Keep bom_no/is_phantom_item pair coherent in get_bom_items_as_dict
When a BOM lists the same item via both phantom and non-phantom sub-BOMs, independent Max() aggregations could pair one line's phantom flag with another line's bom_no, exploding the wrong sub-BOM.
Compute budget requested amount per row
Budget checking was computing Sum(qty) × Max(rate) over all matched Material Request items, fabricating totals when items had different rates; now sums per-row (qty × rate).
Make Procurement Tracker rows coherent PO lines
Multi-line POs with blank material request items were fabricating rows by pairing one line's item with another line's qty and amount; now uses a subquery to pick the representative line per group.
Show earliest schedule date as required date
When a Material Request lists the same item on multiple rows with different schedule dates, the consolidated Requested Items report now shows the earliest date instead of the latest, correctly reflecting urgency.
Campaign with a naming series breaks the UTM Campaign link
When a Campaign uses a naming series, linking to the mirrored UTM Campaign would fail because the link pointed to `campaign_name` instead of the actual document `name`.
Use transaction-currency outstanding on Dunning for foreign-currency invoices
When a Sales Invoice is posted in a foreign currency against a receivable account in the company currency, creating a Dunning now shows the correct outstanding amount in the transaction currency instead of the party account currency.
Stock Closing Entry duplicate check misses contained date ranges
The duplicate-date validation had a logically inert third condition that never fired, allowing a new date range fully contained within an existing entry to slip through.
Close postgres locking races; gate batch valuation with a txn advisory lock
Fixes two phantom-insert races where concurrent operations could create duplicate stock entries on postgres; gates batch valuation with transaction-scoped advisory locks.
Scope Production Planning arrival qty to open POs
The report's Arrival Quantity was summing every submitted PO line ever created including fully received ones, overstating incoming stock; now sums only open POs.
Add v2 discovery API
Internal (WIP, no-docs) API v2 endpoints for programmatic endpoint discovery; OpenAPI compatibility left for external apps.
Add transaction-scoped advisory lock
`frappe.db.transaction_advisory_lock(key)` for postgres: released on transaction commit/rollback, participates in deadlock detection, re-entrant, and shared polling timeout with session-scoped locks.
Print view crash on direct load
Opening `/app/print//` directly threw TypeError because a method reference no longer exists, aborting `print_view.show()` and leaving the page half-rendered.
Wrap write_only inner fn
Internal function wrapping fix for write_only decorator.
Avoid field masking when permissions are ignored
Field masking now respects when permissions are explicitly ignored in queries, returning unmasked data where intended.
Image and barcode blocks with width option
Print Format Builder now supports Image and Barcode blocks; linear barcodes via JsBarcode (browser print), QR codes via pyqrcode server-side as data-URI PNG.
Skip error log for expected exceptions
Adds `skip_error_log` flag to exception classes so expected/benign errors don't clutter the Error Log.
For OCI, revert the VNIC route table in static IP allocation
OCI cleanup: reverts VNIC route table after static IP allocation.
Extend NAT into OCI
Extends NAT (private IP) support from AWS/Hetzner/DO/Frappe Compute into OCI; upgrades OCI SDK from 2.116.0 to 2.180.0 to support VNIC route table attachment.
Add API method discovery commands
`frappe-cli method search|list|show` backed by Frappe's API v2 discovery endpoints; supports `--json` for raw payload or human-readable output.
Require explicit site for non-interactive multi-profile runs
When multiple profiles are authenticated and the CLI runs non-interactively (piped output), it now requires explicit `-s/--site` or env vars instead of silently falling back to the configured default.
Enhance event logging and delivery mechanism
Adds "queued" and "rolled_back" event statuses, implements retry logic for committed events, and enhances logging with timestamps.
Replayable fixture for demo data
Replaces imperative demo generator with deterministic fixture: same forum every seed, timestamps re-anchored to "now", requires no LLM or network.
Don't make newly authenticated sites the default
`frappe-cli auth login` now defaults to `--no-default`, so new sites don't automatically become the default; pass `--default` to opt in.
Resolve VM image from frappe_version
VM provisioning now resolves the OS image based on frappe_version.
Host dashboard shipped under socket activation
Per-host read-only dashboard: Vite/Vue SPA with a stdlib-only backend serving live `/api/state`, organized around Overview/Machines/Images/Storage/Network/Firewall/System sections.
Resize_capacity — per-host headroom for an in-place resize
In-place VM resize now gates on per-host free room (ceiling = host.free + vm.own_footprint), not fleet best-host headroom; includes `placement.resize_headroom()` and whitelisted `provision.resize_capacity()`.
Reconfigure sites with a shorthand name and description
New `frappe-cli auth configure ` to rename and/or describe existing authenticated sites without re-entering credentials.
Remove em-dashes and other AI-speak from demo content
Removed 46 em-dashes and related AI-generated phrasing from demo fixture and seeding docs, replacing with natural alternatives (46 in fixture, 27 in docs, 8 in code).
Respect theme in meet home and shortcut dialog changes
Meet home and shortcut dialogs now respect the user's theme setting.
Follow redirects instead of hard-failing
FrappeClient now follows 3xx redirects (like trailing-slash normalization) safely, since httpx strips Authorization headers on cross-origin redirects.
Operate the Desk frontend from the Flow panel
Adds client tools (read_screen, navigate, fill, submit, etc.) so the panel agent can drive the Desk frontend directly — reads the current route and form state, then manipulates fields and submits.
Sunday, July 5
Shop floor interface for operators
Touch- and keyboard-friendly screen for factory floor supervisors and machine operators to view work orders and manage job lifecycle.
Warning message for new item standard cost
fix: warning message for new item standard cost
Item form permission errors
Opening an Item form as a user with read access but no access to Item Price/Warehouse threw unhandled permission error popups instead of hiding restricted sections.
Reset_mode_of_payments raises AttributeError on a POS Invoice
Calling reset_mode_of_payments on a draft POS Invoice raises AttributeError because the method checks `doc.is_created_using_pos`, a field that only exists on Sales Invoice.
Type cast error on postgres
Clicking on cost center field throws error; Postgres doesn't support `like` operator on `smallint` fields.
Standard helper to render buttons
`frappe.ui.button(opts)` creates Espresso-style button wired with onclick handling, promise handling, and loading states; also available as markup via `.html(opts)`.
Preserve tree view expansion state on back-navigation
Opening a tree, expanding nodes, then navigating back always rebuilt the tree from root, collapsing every expanded node.
Remove outer table border in plain style print output
Bootstrap's `table-bordered` double-bordered the header in plain table style and didn't match the builder preview; removed outer border and standardized header underline.
Add section margin support with per-side spacing control in print format builder
Adds margin support for sections rendered in builder preview and print output; replaces four-stepper padding grid with reusable SpacingRow component; adds table border options.
Show user picker for assignment filter values
Filtering by Assigned To or Liked By required manually entering exact email; now shows a User Link picker for search and selection.
Settings dialog panel scroll
Settings dialog scrolling broke when there were multiple entries and some setting was enabled.
Make field cards fully draggable in print format builder
Drag fields by the whole card instead of only the grip handle; interactive elements are excluded; shows grab/grabbing cursor; browser back closes preview.
Redirect space URL to first page in sidebar order
Visiting a space URL redirected to the first descendant in NestedSet order, not the first page in sidebar sort order; now walks the same tree the sidebar renders.
Hide model api key/base url when a provider is linked, clarify field help
Model form showed API Key and Base URL fields even when a Provider was linked, though the Provider already supplies both.
Undo of an external paste reverts only the anchor cell
Pasting a multi-row text block into a single cell worked, but undo removed only the anchor cell and left every other pasted row.
Redesign the assistant chat and tool-call UI
Sequential non-approval tool calls collapse into one line; arguments render as a compact table; approval requirement now comes from agent's tools instead of hardcoded frontend.
Surface knowledge base descriptions to the agent in the search tool
Flow Knowledge Base `description` field now fed to the model; appends each bound KB's title and description to search_knowledge tool so agent knows what knowledge exists.
Paste tables from external apps via the HTML clipboard flavor
Sheets can now paste structured tables from Excel Online, Google Sheets, Gameplan, or web pages; prefers HTML flavor over tab-delimited plain text.
Add checkbox cells
Google-Sheets-style checkboxes in Sheets; a new data-validation rule that reuses existing validation engine and renders as canvas chips.
Delete linked flow runs when a session is deleted
Deleting a Flow Session left its Flow Runs orphaned; now cascade-deletes linked runs in `FlowSession.on_trash`.
Saturday, June 13
Frappe hardens its test suite with a large batch of new assertions
Adds comprehensive assertions to critical code paths to improve regression detection.
Frappe ships a native Python SocketIO server, cutting realtime memory use
Adds Python-based SocketIO server replacing Node.js to reduce memory usage by running under the gunicorn master process.
Generate preview images from HTML or URLs with bundled Chromium, no external service
Adds native preview-image generation from HTML/URLs using the framework's bundled Chromium, eliminating external service dependencies.
Banker's rounding now handles negative numbers correctly
Fixes sign-blind tie-detection in Banker's rounding that caused -647.325 to incorrectly round to -647.33.
The digest, in your inbox
One quiet email a week — the notable changes across the Frappe ecosystem, no noise.