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