What's New in Frappe
Every notable change across the Frappe ecosystem.
Yesterday — 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.
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.
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.