Weekly report
Frappe and ERPNext changes, 13 Jul to 19 Jul 2026
413 changes merged: 2 breaking, 133 new features, 12 speed-ups, 215 fixes, 51 refactors.
Breaking changes
Read these before you update. They can change how your site or app works.
- breaking Scope state-lookup failure test to get_state_options only Test patching was breaking earlier boot steps; scoped patch to only the affected function.
- breaking Protect system-generated rows Lets apps ship builtin knowledge and system rows managed via migrate-time sync without users breaking them from the Desk.
- feat 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 `<br>`, currency, links).
- feat 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.
- feat Composer — EmailComposer & CommentComposer Two ready-to-use message composers: EmailComposer with headers/attachments/quoted replies, CommentComposer with @-mentions.
- feat 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.
- feat Add N_ noop for translation extraction `N_()` marks strings for gettext extraction without translating at call time.
See all 101 changes
- feat Revoke old token after refreshing Old token is now revoked after refresh.
- feat New control "Attachment Gallery" Adds standard form control for viewing, uploading, previewing, and deleting attachments with optional filtering.
- feat Barcode scanner enhancements Added flashlight toggle, zoom in/out, and keep-scanner-open options for mobile barcode scanning.
- feat 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`.
- feat Add Letter Head to Printing workspace sidebar Letter Head doctype now appears in the Printing workspace sidebar.
- feat Workspace rail Adds workspace dock on the sidebar for displaying and navigating workspaces.
- feat Add SafeDoc class SafeDoc class extends _dict with internal Document methods for safer eval contexts.
- feat Discover methods API discovery now includes controller methods alongside RPC methods with tagged union to distinguish.
- feat 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.
- feat 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.
- feat Empty state component New standard empty state component for list views, dashboards, and reports; replaces duplicate implementations in embedded lists and DocType settings.
- feat 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.
- feat 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.
- perf Stop relying on shipped .po strings in translate tests Translation tests now use Translation records instead of shipped .po strings, preventing CI breaks on Crowdin syncs.
- perf Single-query mark_as_read / mark_all_as_read Replaced multi-row fetches and set_value calls with single UPDATE queries; skips writes on re-marking already-read notifications.
- perf Refactor!: make get_label return untranslated source labels Makes get_label return untranslated source labels and translates at presentation time with DocType context for better i18n handling.
- perf Regression tests for chromium local resource interceptor test: regression tests for chromium local resource interceptor
- perf Lazy load user settings dialog Lazy loads user settings dialog, replaces custom CSS with standard classes, and uses new toast component with embedded refresh button for language changes.
- fix Create notification settings during boot if missing User lockout during boot if Notification Settings doc is missing; auto-creates it on first read with rollback safety.
- fix Sweep all stale preview images on regenerate Sweeps all pf-preview-* files before saving fresh preview, preventing orphaned files from interrupted renders.
- fix Custom permission types denied for Administrator on client Restores evaluation of custom permission types for Administrator on client after merge conflict from backport.
- fix 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.
- fix 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.
- fix Make builder preview pixel-match print output Aligns print format builder preview styling with print output (light-theme lock, token values, gray palette).
- fix Grid row dependencies leaking across rows when columns are configured Shared `DocField` objects now use a per-row dependency context, so hidden/required/read-only state no longer leaks across rows in user-configured grids.
- fix 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.
- fix Sync comment cache on relink Syncs comment cache on both old and new parents when relinking, fixing comment count mismatches on relayed Communications.
- fix 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.
- fix 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.
- fix Column resizing in list view and child tables for RTL layouts Column resizing now works correctly in right-to-left layouts.
- fix Notification dot styles Notification dot styling corrected.
- fix Fix!: Don't run frappe under optimize flag Removes `-O` optimize flags which disable assertions without real benefit.
- fix Allowlist print settings overrides to the doctype's print toggles Caller-supplied print-preview overrides are now restricted to fields the doctype actually exposes.
- fix Use normal exception instead of assert Replaces assertions with proper exceptions for validation errors.
- fix Translate description in info card when `show_description_on_click` is set Info card descriptions are now translated when the toggle is set.
- fix Add missing DF types for controller annotations Type-annotates Geolocation, Signature, Icon, and Long Int fields.
- fix Sanitize frappe.markdown Sanitizes markdown rendering to prevent XSS injection via untrusted markdown input.
- fix Escape script context values before rendering Escapes script context values in form rendering to prevent XSS attacks.
- fix Escape list filter values before rendering Escapes list filter values before rendering to prevent XSS through filter UI.
- fix Escape template context values before rendering Escapes template context values to prevent XSS in dynamic template rendering.
- fix Allow safe tags only in discussion reply md Restricts HTML tags in discussion replies to a safe allowlist, blocking XSS.
- fix Hide submit button for non-submittable documents Removes the submit button from form toolbar for non-submittable doctypes, preventing UI confusion.
- fix Add a perm. chk for ref. document to update_reference method Adds permission check for referenced documents to update_reference method, closing Ticket 72600.
- fix Do not translate empty string Prevents translation of empty strings which was causing issues with gettext extraction.
- fix 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.
- fix 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.
- fix Various issues in sidebar Addresses multiple sidebar UI issues including button centering and alignment.
- fix Render Markdown Editor standard filters as text search Renders Markdown Editor standard filters as text search instead of complex filter UI.
- fix Batch child-table fetch in data export Batches child-table fetches during data export to improve performance and reduce database queries.
- fix 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.
- fix 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.
- fix Truncate MultiSelectList status text within the control box Truncates long selected labels in MultiSelectList controls to fit within the component instead of overflowing.
- fix 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.
- fix Report why chromium failed to start instead of a blanket timeout Reports actual Chromium startup failures instead of generic timeout message, improving CI debugging.
- fix Honour print settings pdf generator for standard printing Respects Print Settings > PDF Generator selection for standard printing instead of forcing Chromium, allowing wkhtmltopdf fallback.
- fix Center the close button Centers the close button in modal headers for better visual alignment.
- fix 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.
- fix Masked child table and link fields leak when selected through dot notation Masked fields in child tables and link fields were being returned unmasked when selected through dot notation in queries, bypassing permission checks.
- fix 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.
- fix 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.
- fix 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.
- fix Add more assertions fix: Add more assertions
- fix Center selected-icon with input text fix(icon-field): center selected-icon with input text
- fix Remove icon from sidebar label fix: remove icon from sidebar label
- fix Remove sidebar collapse fix: remove sidebar collapse
- fix 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.
- fix Guard against invalid navigator.language in alt shortcuts Alt shortcut initialization no longer crashes when browsers return invalid BCP-47 language tags.
- fix Cascading 503 Multiple MAIL commands not allowed after failed SMTP Send SMTP connections left in an inconsistent state after mid-transaction errors are now reset before reuse, preventing cascading send failures.
- fix Ignore not nullable and v15 specific module fetching Fixes database column handling and v15-specific report module fetching logic.
- fix Consider ownership check & perms. when using dot notation Database queries using dot notation now properly enforce ownership and permission checks.
- fix Preserve ui sort order for query report Query reports now preserve user-set sort order instead of resetting to default.
- fix Allow child tables to be used in dashboard charts Chart Dashboards on child doctypes are now accessible to users with appropriate permissions.
- fix Update category retrieval to use `form_dict` pathname Help article categories are now correctly retrieved when accessed via URL routing.
- fix Bump phonenumbers to ~=9.0.23 Upgrades phonenumbers library to correctly validate Saudi Arabia phone numbers with widened mobile pattern.
- fix Data masking ignores role permissions for child table fields Masking code never passed parenttype to Meta.get_permissions(), causing child fields to always appear masked regardless of role permissions.
- fix Validate HTTP method for document calls fix(api): validate HTTP method for document calls
- fix 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".
- fix 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.
- fix 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.
- fix 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.
- fix 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.
- fix 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.
- fix Keep response agnostic fix(pddr): keep response agnostic
- fix UX misleading as there is no cap in backend fix(email_report): UX misleading as there is no cap in backend
- fix Match quoted and unquoted sort/group references to child tables fix: match quoted and unquoted sort/group references to child tables
- fix 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.
- fix Respect user permissions in get_user_defaults Permission filter in get_user_defaults was discarding results; now properly prevents auto-setting default values that the user has no User Permission for.
- fix Fold table colour controls into the style section Moved table header/border color pickers into Style section alongside field controls; fixed label alignment issues.
- fix 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.
- fix 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.
- fix 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.
- refactor Rebuild about dialog on espresso components and utilities About dialog refactored to use es-button, typography/color utilities, and flex/gap; CSS reduced 226→65 lines.
- refactor Rename sidebar to card SidebarCard component renamed to Card to reflect broader usage.
- refactor Migrate page header actions to espresso buttons Migrates page toolbar buttons to new Espresso-styled buttons for consistency and better dark mode support.
- refactor Accept checkbox value for hide_currency_symbol default Updates hide_currency_symbol readers to accept new checkbox value while maintaining backwards compatibility.
- refactor Rename sidebar to card Component renamed to better reflect its role as a general card used everywhere, not just in sidebars.
- feat 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.
- feat 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.
- feat Map settings for DocTypes to show on settings dialog Maps DocType settings to display in the DocType settings dialog General tab.
- feat 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.
- feat 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.
See all 58 changes
- feat Add on hold status to project New Project status for temporarily pausing a project without marking it cancelled.
- feat 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.
- feat 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.
- perf Avoid redundant bom cost_allocation_per query per finished item N+1 query pattern was fetching BOM cost_allocation_per inside loop for each finished item instead of once per document.
- fix Exclude transferred_qty from work order item to pick list item matching Work orders can now produce in multiple batches even after partial production; transferred quantities excluded from matching.
- fix 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.
- fix 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.
- fix Clear linked comments, versions and attachments with old logs Repost Item Valuation and BOM Update Log cleanup now deletes attached Files first and sweeps child records properly, fixing orphaned Comments, Versions, ToDos, DocShares, and file leaks.
- fix 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.
- fix 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.
- fix 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.
- fix Remove duplicate links from home and projects workspaces Removes duplicate entries that appeared after workspace re-export in #56864, fixing doubled links in desk.
- fix 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.
- fix Strip account number when building account name in COA importer Chart of Accounts importer strips leading numbers from account names.
- fix Add fetch from in production plan material request child table Adds fetch_from mapping for Production Plan Material Request items.
- fix 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.
- fix 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.
- fix Strip account number when building account name in COA importer Strips account numbers from account names during Chart of Accounts import.
- fix 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.
- fix 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.
- fix Improved access control for project users Implemented access control for ProjectUsers who don't have the formal Projects User role.
- fix 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.
- fix 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.
- fix Validate mandatory date filters in reports Dashboard charts on reports lacking mandatory date filters raised TypeError instead of displaying a user-friendly validation message.
- fix 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.
- fix Hide job card field in purchase order item fix: hide job card field in purchase order item
- fix 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.
- fix 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.
- fix Fix sqlparse token limit in get_bundle_wise_serial_nos Fixes Stock Entry submission failures on sites with thousands of bundles when SQL token limits exceed parseable range.
- fix Added permission checks on `get_account_balances_coa` Adds missing permission enforcement to Chart of Accounts balance endpoint.
- fix Preserve job card transferred quantity Job card quantity is now preserved during transfer operations.
- fix 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.
- fix 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.
- fix Permission issue fix: permission issue
- fix Duplicate scorecard period when supplier is created on a month end Supplier scorecards created on month-end dates no longer generate duplicate periods.
- fix 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.
- fix Restrict jinja globals in process statement of accounts templates fix: restrict jinja globals in process statement of accounts templates
- fix 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.
- fix Get_terms_and_conditions render_template with safe_exec fix(tnc): get_terms_and_conditions render_template with safe_exec
- fix 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
- fix Enforce read permission on ledger preview endpoints Ledger preview endpoints were missing permission checks, allowing any authenticated user to read GL/SL data for documents they lack access to.
- fix Propagate project from job card to stock entry Added missing project field copy from job card to stock entry in pick list workflow.
- fix Make represents company field in purchase invoice ignore user pe… fix: make represents company field in purchase invoice ignore user pe…
- fix 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.
- fix 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.
- fix 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.
- refactor Gate company restrictions per master via Restrict to Companies checkbox Company restrictions now opt-in per Item/Customer/Supplier via checkbox in Company Restrictions section, replacing global toggle.
- refactor Converted get_dunning_letter_text to doc method and restrict_globals on render_template Refactors dunning letter text generation into doc method and restricts globals in template rendering.
- refactor Convert Hide Currency Symbol in Global Defaults to a Check field Migrates from Select (\"\"/No/Yes) to Check field with data patch and product.py fix.
- refactor Move functionality in postprocess for mapped doc Moves post-mapping functionality to postprocess hook so values are available during after_mapping.
- refactor Release v15 chore: release v15
- refactor Release v16 chore: release v16
- refactor De-conditionalize BaseStockGLComposer via subclass hooks Pushed per-doctype branching out of BaseStockGLComposer into individual voucher composer subclasses; moved Stock Reconciliation voucher-detail synthesis into its own override.
- feat Schedule interview dialog on job applicant form "Schedule Interview" dialog collects all details in one place with auto-populated interviewers from Interview Type.
- feat 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.
- feat 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.
- feat Capture HR product usage & activation telemetry Adds anonymous site-scoped telemetry to measure HR feature usage and post-install activation funnel.
- perf Update db.get_value to get_all Batches employee details lookup to avoid 2N database queries in report.
See all 15 changes
- fix Avoid lambda in safe_eval Removes unsafe lambda usage in safe_eval.
- fix Checkin button no longer defaults to IN while loading Checkin button stays disabled until the last check-in loads instead of defaulting to IN.
- fix Update mandatory_depends_on for payable account Adds mandatory_depends_on constraint for payable account field to ensure proper field dependency rendering.
- fix 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.
- fix Cap OT slip end_date at relieving_date for mid-month leavers Overtime slip end_date wasn't capped at relieving_date for employees who left mid-month, including unearned overtime in the calculation.
- fix 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.
- fix 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.
- fix 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.
- fix 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.
- refactor Deprecate Upload Attendance doctype Upload Attendance removed in favor of Employee Attendance Tool; includes deprecation patch.
- breaking Scope state-lookup failure test to get_state_options only Test patching was breaking earlier boot steps; scoped patch to only the affected function.
- feat 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.
- feat Capture feature adoption using pulse Telemetry events track adoption of web forms, domain enrichment, and ERPNext integration features.
- feat Prefill custom fields in lead to deal conversion form Lead-to-deal conversion now pre-fills custom fields alongside default fields.
- feat Sitemap seeding and extraction fixes Crawl queue seeded from site sitemaps; also fixes extraction and follows nested sitemapindex files.
See all 18 changes
- feat 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.
- feat 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.
- fix Description rendering — preserve line breaks + reliable auto-size Form descriptions preserve line breaks and textarea reliably auto-sizes on load.
- fix Exclude Closed status ToDos from get_assigned_users Syncs assigned users between single page and list page by excluding closed status todos.
- fix Misc frappe-ui fixes Fixes unable to resize columns, context menu not appearing in view settings, and removed usage of `ghosted` button variant.
- fix 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.
- fix Reorder Address Quick Entry layout so Country precedes State Reorders Address Quick Entry fields so Country appears before State, allowing India Compliance's country-dependent state list to apply before user input; adds migration for existing saved layouts.
- fix Builder UI polish + settings consistency Polishes Forms builder UI to match SLA/Assignment Rule settings pages and fixes minor UX issues.
- fix Normalize user names for mentions Mentions in comments broke in prod builds due to missing username normalization.
- fix Refetch cached list resource on remount Cached list data remained stale when returning to a list after editing elsewhere (e.g., `assigned_to`), with no refetch guarantee.
- fix Commentbox regressions after frappe-ui update Users can now be mentioned in comments and comments appear immediately without requiring page reload.
- refactor Patch Release v1.78.2 Patch release for CRM v1.78.2.
- refactor Minor Release v1.78.0 chore: Minor Release v1.78.0
- feat Redesign onboarding as a data-driven card flow Redesigns persona UI onboarding into compact card flow where steps are data-driven and can be reordered by configuration.
- feat Add 'how did you hear about us' question feat(persona): add 'how did you hear about us' question
- feat Build and upload prebuilt assets on push Builds JS/CSS + Vue SPA on push to develop/main/version-* and uploads as rolling `assets-` release for benches to download prebuilt assets.
- fix Checkbox toggle doesn't render until another field changes Settings checkboxes now bind `data[field.name]` directly and toggle immediately.
- fix Harden access-control checks Enforces server-side authorization on LMS endpoints to restrict access to enrolled courses, instructor-only fields, and assignment grading.
See all 12 changes
- fix 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.
- fix 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.
- fix 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.
- fix Fire on_update hook on enrollment progress update LMS enrollment progress updates now fire on_update and on_change hooks, enabling webhooks and DocType events.
- refactor Merge main-hotfix into main Merges hotfix branch into main for LMS release.
- refactor Merge develop onto main-hotfix Merges develop branch onto hotfix for LMS.
- refactor Frappe-ui beta.24 migration and clean up settings Upgrades frappe-ui to beta.24, refactors settings UI, updates component APIs and icon library.
b
Builder
4 new features · 1 fixes · 2 refactors
- feat 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.
- feat 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.
- feat Add 4 corner resize controls and rotation handler Block builder now supports rotation via 4 corner grips (with Shift for 15° snaps) and rotation-aware resize/padding/margin handlers.
- feat Re-arrange blocks right from canvas just by dragging Users can now drag and reorder blocks directly on the canvas without jitter or layout shifts.
- fix Declare color-scheme in head to avoid light flash on dark pages Color-scheme declaration moved to `` so dark pages don't flash white before styles load.
- feat Onboarding persona questionnaire New admins see a one-time stepper collecting org name, team size, tooling, challenges, and goals; answers sent to telemetry.
- fix SidebarItem overflow Sidebar items are no longer cut off on the x-axis.
- fix Reuse existing contact as customer primary contact & accurate ticket counts `create_customer` now reuses existing Contacts by email and routes through `add_contacts`, fixing duplicate Contact creation; Tickets tab now counts accurately.
- fix 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.
- fix Make headers sticky in TicketsTab Column headers in the Tickets Tab of Customer and Contact pages stay fixed when scrolling.
See all 13 changes
- fix Replace emojis with icons for custom views Replaces emoji picker with frappe-ui icon picker and updates saved view icons to use lucide icons.
- fix Ticket SLA policy application Enabled SLAs with a blank condition matched every ticket, silently overriding the default SLA.
- fix Agent reply fails on tickets with no prior communication Replying from agent portal returned 500 for tickets with no Communication, dereferencing `last_communication.name` before null check.
- fix Bump frappe UI to beta-24 Resolves component API regressions introduced by frappe-ui beta update.
- fix Preserve formatting for thunderbird received emails Mails from Thunderbird use `\n` for spacing but lacked HTML formatting; now renders with proper line breaks.
- fix Recent tickets alignment fix: recent tickets alignment
- fix Customer portal permission banner Dialog to revert end users to access each other's tickets.
- refactor Added missing msgstr for translation Adds missing translation string in helpdesk.
- feat 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.
- feat 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.
- fix Polish workbook library dialog Polishes Workbook Library dialog with clearer copy, taller preview area, and tighter header spacing.
- fix Funnel chart drill-down Funnel chart drill-down didn't work because the custom series had no `name` property, so the lookup returned undefined.
- fix 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.
See all 10 changes
- fix Rebuild sales quotation funnel with builder ops Only raw-SQL query across shipped templates; rebuilt as 100% builder-native ops mirroring existing accounting patterns.
- fix 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.
- fix Minor issues Clarifies Allow Data Download interaction with per-role export permissions and fixes drag-drop on touch devices.
- fix Restore telemetry via boot_config + track library adoption Telemetry now works via boot_config pulse client, independent of frappe-ui v1 migration.
- refactor Generate dashboard preview in-process via framework util Dashboard previews now render in-process via bundled Chromium instead of calling external preview.frappe.cloud; falls back to HTTP service on older Frappe.
p
Press
8 new features · 1 speed-ups · 10 fixes · 1 refactors
- feat 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.
- feat Add quickstart page for new onboarders New onboarders with ≤3 sites see a quickstart page after login.
- feat Allow multiple selection for apps removal in benches page feat(ui): Allow multiple selection for apps removal in benches page
- feat Add support for freemium plan Site plans now support lifetime free subscriptions via negative trial days in product trials.
- feat Deploy Wazuh Adds Wazuh security monitoring deployment to Press servers.
See all 20 changes
- feat Add signup-method and create-site-failed funnel events Extended SaaS signup funnel with client-side signals: signup_via_email/google and trial_create_site_failed.
- feat Improve partner onboarding Added approved_on field, company logo upload, link to Frappe School batches, sales contact in sidebar.
- feat Gate local payment tabs behind role permission feat(partner): Gate local payment tabs behind role permission
- perf Split advanced site analytics into per-chart requests Advanced analytics panel now loads charts in parallel via separate endpoints instead of sequentially in a single request.
- fix Block updates on sites with database over 100 GB Blocks site updates on very large databases that would likely fail midway, directing customers to support.
- fix Match correct column name to avoid null Fixes column name mismatch in signup flow that was causing null errors.
- fix Stop fatal updates pinning benches they cannot help Removes unnecessary bench retention from fatal site updates that can no longer provide rollback value.
- fix Fix conflict, plans section fields got added twice Fixes press_settings.json conflict where plans section fields were duplicated.
- fix Add fields to store Raven keys in Press Settings Adds fields to Press Settings for storing Raven keys.
- fix Stop invoice CSV download logging out non-system users Non-system users were silently logged out when downloading invoices as CSV due to auth hook rejecting `frappe.client.get_value` calls outside the API namespace.
- fix Decouple the lead owners list fix(prm): Decouple the lead owners list
- fix Check the public ip address field instead of check box fix(sync): Check the public ip address field instead of check box
- fix Tolerate a missing unit fix(wazuh): Tolerate a missing unit
- fix Don't allow Press User role to access internal plans Internal site plans are no longer visible to Press User role.
- refactor Improve sites list page to make it consistent Sites list UI restyled with multiselect status filter, consistent badge styles, static header and footer.
o
Other
1 breaking · 79 new features · 4 speed-ups · 47 fixes · 28 refactors
- breaking Protect system-generated rows Lets apps ship builtin knowledge and system rows managed via migrate-time sync without users breaking them from the Desk.
- feat 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.
- feat 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.
- feat Show failed tool calls in activity timeline Surfaces a "Failed" badge on tool calls whose result is an error payload; message shown in dropdown.
- feat Add template renderer Minimal Jinja2-like template renderer to simplify nginx config code and reduce f-string complexity.
See all 159 changes
- feat 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.
- feat 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.
- feat Threaded, resolvable cell comments Cell comments turn into threaded discussions with resolve/reopen, @-mentions, and timestamps.
- feat 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.
- feat 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.
- feat Lossless XLSX import/export XLSX round-trip now preserves formulas, number formats, merges, and all sheets; replaces string-only bridge.
- feat 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).
- feat Local email-address suggestions (Tantivy) Local per-account full-text index powers email-address suggestions from cached messages and contacts without JMAP round-trip.
- feat Scope screening backfill to active, configured, fetching users Screening patch now targets a precise set of active users with JMAP configured, avoiding redundant backfill.
- feat Enable screening by default for new accounts New JMAP Accounts start with screening enabled instead of requiring manual opt-in.
- feat 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.
- feat 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.
- feat Template library: 17 new template groups Grows template catalog from 11 to 27 groups across Fashion, Portfolio, Technology, and Marketing.
- feat Canvas unification — Phase 4a: frame origin data model Unified documents add `origin` {x,y} to mind maps and flowcharts; legacy single-type docs unaffected.
- feat Canvas unification — Phase 4d: Templates/Insert menu for frames Insert menu adds starter mind maps or flowcharts to the unified canvas.
- feat Canvas unification — Phase 4c: select & move frames Mind map and flowchart frames are now first-class selectable/draggable objects on the unified canvas.
- feat 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.
- feat Frappe Draw: Writer-style diagram sharing (view/comment/edit) — backend Diagram sharing built on Frappe core DocShare + custom "comment" permission type, no Drive dependency.
- feat Add Frappe server-tests job Adds Python doctype test gating to Draw CI.
- feat 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.
- feat Show plain-English intent for execute tool confirmations Execute tool approval card now shows one-line `description` of intent as title with code below.
- feat Custom rules Custom WAF rules UI added.
- feat Structured -F values (key:=json), fix GET --input `-F key:=json` now parses JSON values; fixes `GET --input`.
- feat 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.
- feat Canvas unification — Phase 2a: tool-keyed interaction dispatcher Converts surface interaction registration from single-slot ref into layer-keyed registry resolved by active tool.
- feat 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.
- feat Custom Excel-style number formats Adds custom number format type allowing Excel-style format codes beyond built-in presets with interpreter covering common codes.
- feat 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.
- feat Web Application Firewall Implements web application firewall functionality for Pilot.
- feat Add filesystem path tab completion Adds filesystem path tab completion for bench commands like restore, backup, and data-import.
- feat 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.
- feat 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.
- feat 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.
- feat 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.
- feat Billing invariant audit Adds billing invariant violations report that surfaces rows with inconsistent team/amount pairs for audit verification.
- feat 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.
- feat 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.
- feat Remember selected panels & open file in editor Persists selected panels and open file in Studio editor across page refresh.
- feat Misc features Adds method call verb, drops confirmation prompts, improves default behavior and debug hints.
- feat 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.
- feat 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.
- feat Get app validations Refactored app validator into a pluggable package with checks for repo structure, syntax, dependency declarations, and static import resolution.
- feat 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.
- feat 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.
- feat 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.
- feat Search across accounts Opt-in toggle to search across all JMAP accounts the user owns, with results merged newest-first.
- feat 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.
- feat 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.
- feat 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
- feat Permission-respecting sandbox for the execute tool Replaces permissionless Frappe safe_exec with an allowlisted sandbox that enforces the running user's permissions on all reads and writes.
- feat 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.
- feat 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.
- feat Note server scripts requirement for script tools and conditions Adds documentation that Flow script tools and conditions require `server_script_enabled`.
- feat 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.
- feat 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.
- feat Template categories, responsive layout fixes, and catalog cleanup Template picker now organizes templates into four categories (Marketing, Portfolio, Editorial, Local Business) with responsive improvements.
- feat Backup retention management and audit logging Adds backup retention policies and audit logging for backup management operations.
- feat 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.
- feat Infinite scroll for All Inboxes All Inboxes view now uses infinite scroll instead of offset pagination with collapsible date groups.
- feat 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.
- feat Add find-doc-save-hooks.sh Utility script surfaces app-side document save hooks that impact performance.
- feat 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.
- feat Replace mailbox pagination with infinite scroll Next batch appends as you scroll instead of refetching 25-row pages; already-loaded rows never re-fetched.
- feat Stop response Stop button while response streams to abort and finalize run; deny tool-approval now ends turn instead of continuing.
- feat Import & Export Contacts (JMAP + .vcf) Submittable Contacts Exchange DocType for background import/export with jmap (round-trippable JSContact) and .vcf (vCard 4.0) formats.
- feat Discover and invoke doctype methods Extends API discovery to include controller methods; frappectl method list/search now cover new surface.
- feat SSH Key Management feat: SSH Key Management
- feat JWKS-based remote session login Central can mint tokens for bench login and generate site-login SID via dummy JWKS server.
- feat Gate multi-bench UI/API behind admin.allow_bench_management feat: Gate multi-bench UI/API behind admin.allow_bench_management
- feat 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.
- feat 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).
- feat Declare Frappe Cloud version compatibility Added [tool.bench.frappe-dependencies] to pyproject.toml so Frappe Cloud validates app compatibility during installs/updates.
- feat Pull @framework/ui components and upgrade frappe-ui to beta 24 feat: pull @framework/ui components and upgrade frappe-ui to beta 24
- feat Merge develop to main Merge develop to main
- feat App validation Pre-install app validations to ensure internal and external imports are accounted for and directory structure is correct.
- perf Hang guard + auto-resume, trustworthy Step 3, faster party/account import Per-record hang guard auto-resumes on timeout, trustworthy ledger Step 3, and batched party/account import for reliability under ~700 MB customer runs.
- perf Update vite to 8+ version perf: Update vite to 8+ version
- perf Restructure patches into frappe-style v0_0 layout Consolidates 32 patch modules into flat central/patches/v0_0/ package with migration for existing Patch Log entries.
- perf Reclaim parsed-file memory to the OS after extraction Drops parsed record elements and caches after extraction and calls gc.collect() + malloc_trim() to free memory to OS before import.
- fix Render multi-line and long text as a code block Multi-line/long string fields no longer truncated to one line in record titles.
- fix Audit authz Fixes ten security findings from the July billing audit: domain-layer functions lacked authorization checks, allowing any logged-in user to call credit/payment/plan APIs for any team; money paths and team access are now gated at the auth layer.
- fix Keep execute description required so the model always supplies intent Reverts default on execute tool description so the model always supplies intent text.
- fix Make Flow installable on Frappe Cloud and v16 Adds `[tool.bench.frappe-dependencies]` and pins litellm to support Python 3.14 and Frappe v16.
- fix 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`.
- fix Cancel error on loan security assignment when loan value is empty Cancel no longer crashes when loan amount is None.
- fix Consistent empty states across pages Unified empty-state rendering and copy across Attachments, Notifications, and other Drive pages.
- fix Flexible comment layout with chips and mobile support Writer comments now use a symmetric grid with mobile-responsive chips and bottom sheet.
- fix 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.
- fix Editor layout, comments & read-only selection; drive dialog fixes Unified editor scrolling, permanent comment gutter, restored text selection in read-only, and dialog fixes.
- fix Replace whole roles field instead of patching union discriminator Stalwart account role assignment now patches the whole roles field instead of sub-paths.
- fix Let user know we are waiting for cache fill User-facing message when waiting for cache fill.
- fix Drop the "mutations run without confirmation" tip Removes misleading guide text about mutations.
- fix A team can no longer be billed twice for one period Adds database locking to prevent race condition where concurrent billing runs could invoice a team twice for the same period.
- fix 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.
- fix 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.
- fix Credits negative balance Fixes currency-blind credit anchor that allowed per-currency balances to go negative while the guard approved debits.
- fix Mount FrappeUIProvider in slides shell Mounts FrappeUIProvider in slides shell and migrates deprecated toast.create calls to new toast API.
- fix 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.
- fix 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.
- fix 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.
- fix Durable payment intent Improves payment intent durability in Central.
- fix Add frappe-ui molecules directory to tailwind content glob Adds frappe-ui molecules to Tailwind content glob so utility classes are generated.
- fix Remove claude's system prompt in assistant mode Removes Claude system prompt from frappectl assistant mode.
- fix Serve template pages with a frame-ancestors CSP Template pages now serve with `Content-Security-Policy: frame-ancestors *` to allow embedding in the builder picker's inline preview on non-Frappe Cloud sites.
- fix 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`.
- fix Raise toast z-index above sticky columns fix: raise toast z-index above sticky columns
- fix Print exceptions fix: print exceptions
- fix 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.
- fix 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.
- fix Route reconnect lifecycle events Media reconnection events are now correctly routed after connection recovery.
- fix Recover media after signaling and ICE failures Video meetings now independently recover transports after signaling and ICE failures, resync participants, and preserve E2EE state.
- fix Bound SFU request acknowledgements Prevents unbounded SFU request acknowledgement queues in video meetings.
- fix Restore screen share after recovery Screen sharing is now restored after video meeting recovery.
- fix 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.
- fix 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.
- fix 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.
- fix 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.
- fix 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.
- fix Multiple writer issues Fixed font size and family features being broken, and redone layout for Writer to fix scroll issue.
- fix Base amount for EPF calculation fix: Base amount for EPF calculation
- fix 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.
- fix Update via PyPI fix: update via PyPI
- fix Trusted-proxy nginx gating and local domain validation fix: trusted-proxy nginx gating and local domain validation
- fix Update release version fix: update release version
- fix Avoid circular imports of chunks fix: avoid circular imports of chunks
- fix Correct DocType casing in read tool label fix: correct DocType casing in read tool label
- refactor Consolidate BenchConfig and align naming with style rules Consolidated bench config files into single `BenchConfig` class; methods renamed to follow style rules (is_/has_ for booleans, get_/render_ verbs, dropped abbreviations).
- refactor Allow frappe v16 through current develop Frappe dependency bumped to `>=16.0.0,<18.0.0` and requires-python to `>=3.14,<3.15` to align with frappe develop.
- refactor Backend module layout and reduce verbosity Reorganized core/CLI/task/manager code by domain; moved behavior into Server/Bench/Site/App objects; reduced cyclomatic complexity.
- refactor Stop non-CLI code from calling Command classes Moves Command logic onto core so background tasks and admin/backend no longer instantiate Command directly; adopts cappa for CLI design.
- refactor Less boilerplate, smaller files Collapses duplicated bootstrap code, derives task argv from job parsers, merges commands/remove into commands/setup, splits nginx.py, and deduplicates fstab/mount plumbing.
- refactor Backend cleanup (naming, exceptions, dedup, layering) `@property` conversions, exception consolidation under `BenchError`, debug logging on silent exception blocks, subprocess timeouts on 18 calls, and shared nginx/SSL dedup.
- refactor Use err_console Error output now uses standardized err_console.
- refactor Restructure backend Restructures admin/backend into layered pilot/ package with core, managers, commands, tasks, integrations, config, and internal modules for clarity and LLM code generation.
- refactor Issue forms with required app selection + app labeler Adds GitHub issue workflow requiring app selection before filing with auto-labeling for Drive, Slides, Writer, Sheets, Meet, Mail, Calendar.
- refactor Move resolution to get-app & move marketplace to a repository Moves app dependency resolution into get-app command and marketplace to separate repository with unified install path.
- refactor Make stateful boundaries explicit Refactors frappectl around objects owning configuration, credentials, HTTP policy, API resources, and output state for cleaner architecture.
- refactor Remove unnecessary comments Removes unnecessary comments from codebase.
- refactor Scope doctype-source extract tests to their own records Scopes extract tests to their own records to prevent order-dependent flakes from other test ToDos in the database.
- refactor Override module in execute_with_logging Adds optional module parameter to execute_with_logging for correct error log module attribution.
- refactor Use button props directly in chat and people panel refactor(meet): use button props directly in chat and people panel
- refactor Move Sidebar into separate file & biom format refactor(ui): Move Sidebar into separate file & biom format
- refactor Remove redundant files refactor(mail): remove redundant files
- refactor Move common utils from mail to suite refactor: move common utils from mail to suite
- refactor Sudo less single user owned DB instance setup without Alpine support Removes sudo requirement for bench-user path, drops Alpine Linux support, fixes PostgreSQL socket directory for user instances.
- refactor Use Settings components from frappe-ui refactor: use Settings components from frappe-ui
- refactor Rename frappe-cli to frappectl refactor: Rename frappe-cli to frappectl
- refactor Remove ZFS from bench refactor: Remove ZFS from bench
- refactor Update documentation for Central and streamline local development setup chore(readme): update documentation for Central and streamline local development setup
- refactor Remove old dashboard, rename console to dashboard Refactor: Remove old dashboard, rename console to dashboard
- refactor UI polish pass across servers, billing, and notifications Page headers slimmed to 48px; notifications flattened to divider-separated list; all styling uses Frappe UI / espresso tokens.
- refactor Release v16 chore: release v16
- refactor Revert "fix(job): make job timeout configurable via request param" Revert "fix(job): make job timeout configurable via request param"
- refactor Update readme file chore: Update readme file