Weekly report
Frappe and ERPNext changes, 14 Sep to 20 Sep 2026
385 changes merged: 4 breaking, 97 new features, 21 speed-ups, 209 fixes, 54 refactors.
Breaking changes
Read these before you update. They can change how your site or app works.
- breaking Don't overwrite saved values with field defaults on edit Field defaults were overwriting saved values when editing a submission, causing data loss and breaking dependent fields.
- breaking Match the command palette backdrop to other dialogs Command Palette had a custom backdrop while the Keyboard Shortcuts modal used the default, breaking visual consistency.
- breaking Upload favicons and meta images as public files Site favicon, page favicon and meta image uploads were private, breaking guest access and causing broken images.
- breaking Resolve the job timeout without ever failing the enqueue Hardens job timeout resolution to handle JSON arrays, string values, and missing keys without breaking the enqueue path.
Highlights
Let a host place a component part in a FormLayout column or between sections
frappe · feat
Page.form, the Details form as one list, and page.form.tabs
frappe · feat
Page.frame, bands above, between and below the page's regions
frappe · feat
Add page.body, the body row as one list of columns
frappe · feat
Header ownership — props forwarding, component in both zones, pinned Save, clear()
frappe · feat
Publish an import map for stored Client Scripts
frappe · feat
- feat Let a host place a component part in a FormLayout column or between sections FormLayout now accepts custom Vue components as parts in columns or between sections for deep customization.
- feat Page.form, the Details form as one list, and page.form.tabs Record page Details form now surfaces as one list with section ownership and tab support.
- feat Page.frame, bands above, between and below the page's regions Record page now surfaces page.frame as one list with header and body regions that can host bands before, between, or after.
- feat Add page.body, the body row as one list of columns Record page body row is now exposed as one list of columns with built-in form and panel columns.
- feat Header ownership — props forwarding, component in both zones, pinned Save, clear() Record page header now supports props forwarding, component placement in both zones, pinned Save button, and clear() method.
See all 86 changes
- feat Publish an import map for stored Client Scripts Stored Client Scripts now have access to vue, vue-router, and app-published packages through an import map.
- feat Draw a stored script's icon from the shell's sprite Renders client script lucide icons from the shell's sprite instead of frappe-ui's, supporting icons even without prior bundle use.
- fix Open a single doctype on its record, never a list Fixes sidebar items for Single doctypes to open the record page instead of a non-existent list view.
- breaking Don't overwrite saved values with field defaults on edit Field defaults were overwriting saved values when editing a submission, causing data loss and breaking dependent fields.
- feat Version history with restore, undo and redo buttons Adds version history tracking with restore, undo and redo buttons to Print Format Builder.
- feat Linked fields in typst, bold/font size on every field, clearer renderer hint Renders linked fields through Typst renderer, adds bold/font size controls to all fields, improves renderer hint organization.
- feat Record page reads and saves through the v2 wrapper Routes record page reads and saves through the v2 API wrapper with include parts and meta-with-children support.
- feat Lists, counts and link search go to /api/v2 Routes every list, count, link search and list-settings call through desk-owned /api/v2 wrapper.
- feat Desk-owned fetch wrapper over /api/v2 Adds @framework/ui/api module for all server calls in ui/src, exporting getDocument, listDocuments, countDocuments and CRUD operations.
- feat Drag recipients between the composer's To, CC and BCC rows Mail composer recipient chips can now be dragged between To, CC and BCC rows, with rows opening on drag start.
- feat Static text, linked field and barcode elements for the beta builder Print format builder now supports static text, linked fields and barcode elements with full canvas preview.
- feat Add never_skip_patches hook to stop migration on patch failure Apps can list patches in `never_skip_patches` that should halt migrations on failure instead of being skipped.
- feat Post-review workflow can reply inside existing review threads Review workflow can post follow-up replies inside existing review threads instead of opening new reviews.
- feat Publish docinfo_update for shares, tags and favourites Record page now receives live docinfo updates for shares, tags, and favourites made in other tabs.
- feat Keep docinfo live over the docinfo_update socket Record page docinfo now stays fresh over the socket instead of staling when assignments or comments happen in other tabs.
- feat Let an app publish names to the import map with an `import_map` hook Apps can now declare import_map hooks to publish names to the record page's import map for stored Client Scripts.
- feat Workflow automations Frappe now supports declarative workflow automations: when something happens to a record, do these things in order without code.
- perf Let post-review post request-changes reviews Post-review workflow now supports posting REQUEST_CHANGES verdict alongside APPROVE.
- perf Let post-review update an existing bot review body Post-review workflow can now update an existing bot review instead of creating duplicates.
- perf Add post-review workflow for maintainer-triggered bot reviews New post-review workflow lets maintainers trigger bot reviews from JSON payload without new secrets.
- perf Stop the impact map bailing out on test modules and stray JSON Improves CI impact map resilience to select a test subset on 26% of changesets instead of bailing out.
- perf Reduce PR stale threshold from 28 to 20 days Reduces PR stale threshold from 28 to 20 days and close threshold from 3 to 2 days to reflect faster response times with LLMs.
- fix Require write permission before fetching openid_configuration Prevents unpermissioned users from fetching openid_configuration URLs via run_doc_method.
- fix Check read perm for get_print_settings_to_show Enforces read permission on the get_print_settings_to_show endpoint per Ticket 77686.
- fix Add SQL execution compatibility Translates MariaDB SQL through SQLGlot before SQLite execution to handle placeholder conversion, quoting, and function compatibility.
- fix Make schema changes and backups safe Preserves columns, indexes, constraints, triggers during table rebuilds and makes uncommitted schema metadata transaction-local.
- fix Support query builder and search Adds SQLite ON CONFLICT support, date/time and JSON functions, and FTS5 MATCH behavior for the query builder.
- fix Strip quote marker from link labels in export Removes quote markers from Link and Dynamic Link columns in Excel/CSV exports to match desk display of linked titles.
- fix Double fetch calls on sending email and broken socket connection Moves subscription to shared store with reference counting, coalesces refresh calls, and rejoins rooms on reconnect.
- fix Write whole number indent in excel export Converts tree indent levels to integers before writing to Excel to comply with spec requirements.
- fix Drop with_link_titles from report view exports Removes the with_link_titles parameter before passing report args to export_query to prevent unexpected keyword argument errors.
- fix Allow filtering User by user_type with read permission Allows filtering User by user_type with read permission per issue #42902.
- fix Missing linked target, canvas row spacing and once-only footer position Handles missing linked targets gracefully, removes print-format class for correct row spacing, positions letterhead footer at page bottom.
- fix Create the run lookup index with a portable helper Replaces raw ALTER TABLE with portable frappe.db.add_index helper for cross-database compatibility.
- fix Build a search index that does not exist yet Fixes logic that prevented automatic search index creation when the scheduler calls build_index.
- fix Custom table columns, slash field picker and zoom dropdown in the builder Adds slash command field insertion, canvas zoom dropdown, and fixes custom table column rendering.
- fix Inspector spacing and builder review fixes Fixes spacing issues in Print Format Builder inspector and reorganizes section border controls.
- fix Use theme-aware tokens in sidebar for dark mode Updates sidebar to use theme-aware design tokens for proper dark mode rendering.
- fix Set patch as completed when after_install completes Marks patches as completed when their after_install hook completes per issue #42090.
- fix Revert "fix(timeline): double fetch calls on sending email and broken socket connection" Revert "fix(timeline): double fetch calls on sending email and broken socket connection"
- fix Prevent renaming Single DocTypes Rejects attempts to rename Single DocTypes at the backend, hides the rename action in the toolbar, and forces allow_rename to remain disabled.
- fix Respect dark mode in splash screen Splash screen remained in light mode even when dark mode was enabled globally.
- fix Require document type and field in add column dialog Query report add-column dialog threw `TypeError` when submitted without required fields instead of listing the missing values.
- fix Use the amber badge theme Onboarding chip, email delivery status and data import badges appeared grey after frappe-ui dropped the orange theme.
- fix Standardise text editor heading and list typography Text editor headings and lists used Quill's stock sizing instead of frappe-ui's prose scale.
- fix Accept fractional seconds and unpadded hours in validate Web Form datetime validation rejected valid dates with fractional seconds and unpadded hours.
- fix Disable tab selection in awesomplete settings Tab key was committing awesomplete's auto-highlighted first entry instead of moving to the next field.
- fix Harden File list permissions Honor if_owner on attached doctype in File list permissions.
- fix Validate condition fields on every save Naming rule conditions now validate on every save, not just when the document type changes.
- fix Revalidate length after sanitization HTML sanitization can mutate fields after validation; length check now runs after sanitization to prevent data loss from exceeding column limits.
- fix Align file preview row in RTL RTL languages now display file preview rows with correct alignment.
- fix Sort selector in list view Sort selector now shows correct icon and title.
- fix Translate dock entry titles on resolve Dock entry titles now translate on resolve.
- fix Show configured Link titles in reports Doctypes with "Show Title in Link Fields" now display titles consistently in both query reports and Report Builder.
- fix Truncate legend in non circular chart Non-circular chart legends now truncate correctly after regression fix.
- fix Render rich-text merged fields as HTML in print formats Editor fields in merged cells now render as HTML in print formats instead of stripped plain text.
- fix Listen to client_script_changed and drop the cached scripts Stored Client Scripts now invalidate correctly when changed in another tab.
- fix Drop the editor stylesheet import frappe-ui no longer exports Removed unsupported frappe-ui stylesheet subpath import from ActivityTimeline component.
- fix Confine write_file target to the files directory Restricts file write operations to prevent path traversal attacks.
- fix 500 with an unparseable body when an after commit callback fails Returns valid JSON error responses when after-commit callbacks fail, instead of HTML that cannot be parsed.
- fix Clear button busy state when callback returns a jQuery deferred Fixes buttons that return frappe.call to properly clear busy state instead of throwing "response.finally is not a function".
- fix Show Link titles in print previews Displays Link field titles in print previews, matching behavior in PDF output and standard views.
- fix Keep list format filters when merging link filters Preserves list-format link filters when merging with set_query filters, preventing search errors on combined filter conditions.
- fix Drop filter values from export file name Removes filter suffixes from report export filenames to avoid exceeding the 140-character file name limit.
- fix Keep RTL languages from flipping nav arrows Extends rtl:ignore block to prevent calendar navigation arrows from flipping in RTL mode.
- fix Make child table heading text visible in dark mode Improves contrast of child table headings in dark mode for better readability.
- fix Make welcome message translatable and close div tag Makes portal welcome message translatable and fixes an unclosed HTML div tag.
- fix Improve contrast of checked checkboxes Increases contrast of checked checkboxes in dark mode for better visibility.
- fix Dock z-index issue Resolves z-index conflict between dock and grid components.
- fix Show mobile list subject bold only for unread rows Shows bold subject text only for unread list items on mobile, improving visual distinction.
- fix Keep the remote error message in FrappeException Preserves remote error messages in FrappeException instead of raising exceptions with no message.
- fix Fix(oauth2)!: require PKCE for public clients Public OAuth clients without a secret are vulnerable to authorization code interception; PKCE is now required per updated RFC guidance to protect the authorization code exchange.
- fix Cast JSON columns before comparing them in filters Postgres json columns lack equality operators; queries now cast to varchar before comparison to avoid operator-not-found failures.
- fix Cast JSON columns in order by, group by and distinct selects Extended JSON casting to ordering, grouping, and distinct operations; fixes list sidebar grouping and sort selectors on JSON fields.
- fix Drop the exists() rewrite for child-table filters Legacy exists() rewrite removed joins needed for child table resolution and changed result cardinality; reverted to preserve join behavior.
- fix Keep the table qualifier in the legacy MAX() sort column Ambiguous column reference in postgres when joining tables with unselected group-by and order-by; table qualifier now preserved in MAX() argument.
- refactor Cleanup of print format builder Removed duplicate Duplicate button, fixed sizing controls, consolidated SliderRow component, and improved padding.
- refactor Remove set level control from tree reports Removed tree level input and Set Level button from tree report footer.
- refactor Add @rameensh Contributor added to vouched users.
- refactor A docstring on refuse_field_name Added docstring for refuse_field_name public function.
- refactor Drop dead PKCE code Removed unused PKCE code that was superseded by required PKCE enforcement.
- feat GL-only reposting from Stock and Account Value Comparison report Adds Create GL Reposting Entries button for rebuilding General and Payment Ledgers while preserving stock valuations.
- feat Use serial no wise valuation switch on item Items can now opt out of serial-number-wise valuation to handle millions of serial numbers without individual cost tracking.
- perf Reduce memory consumption during reposting Processes SLE updates per item-warehouse instead of loading all future SLEs at once to reduce peak memory usage.
- perf Skip the negative batch scan when nothing is negative FIFO warehouse replay skips batch scans when no negative slots exist, reducing quadratic time complexity.
- perf Chunk the serial and batch entry backfill patch Serial and batch entry backfill now chunks at 50k rows per commit instead of running one massive transaction.
See all 46 changes
- perf Skip legacy batch ledger lookups when no legacy entry exists Deprecated batch valuation queries on every outward entry now skip when no legacy batches exist.
- perf Look up stock accounts once per company in the warehouse account map Optimizes warehouse account map building to resolve stock accounts once per company instead of per warehouse.
- fix Forward company to outward batch lookup Passes company filter to batch availability lookup during outward auto-selection.
- fix Respect manual picking when mapping sales orders Prevents automatic serial/batch allocation when Pick Manually is enabled in Pick List creation.
- fix Validate bank reconciliation date ranges Consistently validates reversed date ranges in both normal and reference-date modes.
- fix Continue putaway allocation after undersized whole-uom rules Allows putaway to continue through later warehouse rules when an earlier rule cannot accommodate whole units.
- fix Validate shipping rule account company Validates that a Shipping Rule's account belongs to the selected company.
- fix Clarify revaluation journal filters Renames "Revaluation Journals" label to clarify that the checkbox controls inclusion of revaluation journals.
- fix Reserve product bundle components from a Pick List Reserve Stock failed for product bundle components because the reserve logic keyed on the bundle item instead of the component.
- fix Include the mrp bucket that ends on to_date MRP buckets starting on the To Date filter were never created, silently dropping demand records from that period.
- fix Take the job card secondary UOM off the representative line Secondary items report was pairing one line's UOM with another's due to text-based sorting across database engines.
- fix Take the requested-item UOM pair off one line Material Requirements report could pair one item's UOM with another's when the same item appeared twice in a request.
- fix Report a Prospect quotation's territory Quotations raised to a Prospect were reporting no territory after a prior change removed that case from the territory lookup.
- fix Take the POS summary labels off one invoice, not a text sort POS summary rows were pairing cost_center and payment mode from different invoices due to text-based aggregation.
- fix Reset ordered_qty when a cancelled Sales Order is unlinked from its Purchase Orders Cancelled Sales Orders left stale `ordered_qty` values that never cleared even when the Purchase Order link was removed.
- fix Retain bom components without warehouse stock BOM Stock Analysis removed components with no Bin record, overstating maximum production when stock wasn't yet stocked.
- fix Validation and line reference corrections for FRT Fixed formula division-by-zero during validation, context variable shadowing and math function duplication.
- fix Allow zero completed quantity and handle process loss in job cards Job cards can now save with zero completed quantity when units are lost as process loss.
- fix Apply mrp manufacturing buffer as a duration Manufacturing buffer now correctly adds to lead time instead of reducing it.
- fix Show item description in Classic print formats Item descriptions now appear as secondary lines under item names in Classic transaction print formats.
- fix Prevent max recursion on supplier scorecard save Creating or updating a Supplier Scorecard for a supplier created on the last day of a month no longer causes infinite recursion.
- fix Clear stock value for zero-quantity balances Zero-quantity balances now have zero stock value, preventing ledger entries with zero quantity and non-zero value.
- fix Avoid pricing rule help template errors Pricing Rule help text no longer triggers template compilation errors when already-rendered HTML is reassigned.
- fix Use stored posting_datetime when reposting stock ledger entries Stock ledger reposting now uses stored posting_datetime instead of rebuilding it, preventing skipped entries and wrong balances.
- fix Filter item group defaults by company and non-group records Item Group defaults now filter accounts and warehouses by company and exclude group records.
- fix Negative stock value for moving average item with mixed batchwise valuation Moving Average items with mixed batchwise valuation now calculate outward rates correctly instead of draining stock value.
- fix Render letter head jinja in statement of accounts pdf Statement of Accounts PDF now renders template-based letter head Jinja correctly instead of showing broken template syntax.
- fix Update modified for last purchase rate Updated modified timestamp when last purchase rate changes.
- fix Ask for a BOM before creating MRP work orders Replaces error-only flow with a dialog allowing users to select or specify a BOM before creating work orders for items without a default BOM.
- fix Classify MRP rows by purchase item, not missing BOM Fixes classification of manufactured items without a default BOM to prevent them being incorrectly marked as purchase items.
- fix Value stock entry rows as of the posting date Values stock entry rows using the valuation rate as of the entry's posting date instead of the current rate, preventing drift on reposts.
- fix Item selection writes to the child table that fired it Fixes item selection callbacks that were inadvertently writing to standard `items` table instead of the custom child table that triggered the selection.
- fix Asset depreciation table stays empty if you check the box before entering the amount Ensures depreciation table populates correctly when Calculate Depreciation is enabled before entering the purchase amount.
- fix Do not decorate self-referential links with the row's own title Prevents Link fields that reference the same doctype from being decorated with a title, which was displaying incorrect information.
- fix Scope stock ageing batch and serial age to the warehouse Scopes batch and serial age cache to include the warehouse to prevent inconsistent aging across different warehouse filters.
- fix Consume batch slots newest first for LIFO items Fixes LIFO item valuation to consume batch slots in the correct order, preventing incorrect reporting of issued stock.
- fix Handle missing bank reconciliation document types Normalizes omitted document types in bank reconciliation to prevent TypeError in get_linked_payments.
- fix Show linked record count on Supplier Scorecard connections Removes overridden method that was suppressing record counts on the Supplier Scorecard dashboard.
- fix Validate project across the subcontracting flow Project field was not carried from Purchase Order Items to Subcontracting Orders, allowing project mismatch that corrupted stock ledger and GL entries; now validates project consistency across the entire flow.
- refactor Share the bin subquery in BOM Stock Analysis Unified bin aggregation between BOM Stock Analysis report paths, eliminating duplicate subquery logic.
- refactor A representative row must not be picked by Min(name) Documentation correction on picking representative rows in queries.
- feat Pass separate Journal Entry for employer contributions Employer Contribution salary components now create separate Journal Entries with Liability Accounts instead of passing through Payroll Payable.
- fix Resolve holiday lists via Holiday List Assignment for the document period Resolves holidays via Holiday List Assignment over the document period instead of ignoring period coverage.
- fix Validate search input Backports search input validation to version-14.
- fix Grant leave access based on document read permission Leave Application access was incorrectly checking for leave_approver instead of respecting workflow-based reviewer permissions.
- fix Preserve last checkin log during background reloads First checkout from the mobile app was sometimes recorded as checkin after a morning checkin due to stale state during background reloads.
- feat Publish `crm/lib` to the record page's import map CRM now publishes crm/lib to the record page's import map for stored Client Scripts.
- fix Skip password setup for LDAP users Skips password setup for LDAP users in CRM per issue #2844.
- fix Validate cached onboarding lead/deal before navigating Validates that cached lead/deal IDs still exist and are readable before navigating to them in onboarding.
- fix Map Exotel call statuses to valid Call Log options Exotel call statuses now map correctly to valid Call Log status options.
- fix Remove duplicate error toast on lead and deal field update Removes duplicate error toasts shown when field updates fail due to server-side errors.
See all 7 changes
- fix Stable home default view and derive doctype in set_as_default Resolves home default view in a fixed order and derives doctype from name when not provided in set_as_default.
- refactor Checkout frappe develop for @framework/ui in frontend CI CRM frontend CI now checks out frappe develop for @framework/ui.
- feat Translate student-facing interface messages Discussion replies, billing login notice and cover image picker messages are now translated for all locales.
- feat Add migration testing LMS migration testing from v2.0.0 to current version following Frappe engineering handbook guidance.
- feat Adopt frappe-ui components LMS frontend now uses frappe-ui Command Palette, Tooltip, and Drawer components instead of custom implementations.
- feat Adopt frappe-ui Password, Spinner, Alert, ErrorMessage and CodeEditor LMS now adopts frappe-ui Password, Spinner, Alert, ErrorMessage, and CodeEditor components across Settings and Payment Gateway forms.
- perf Build server-test fixtures once per class and drop duplicate cases Tests now run inside savepoints and roll back after each test, reducing fixture recreation and user creation overhead.
See all 20 changes
- perf Freeze nowdate() alongside getdate() in the evaluator schedule tests Schedule tests now freeze nowdate() to prevent midnight-crossing failures.
- fix Reset submission view when switching assignments Navigating between assignments displayed the first assignment's submission on all assignments, confusing both learners and evaluators.
- fix Stop marking the profile image as mandatory Profile image field showed the required asterisk despite being optional.
- fix Ignore autorepeat keydown for command palette shortcut Ignores autorepeat keydown events for the command palette shortcut to prevent multiple triggers from key hold.
- fix Russian "Checkout" wording implied payment Updates Russian translation of "Checkout the course" to "View" since the links open free content without payment.
- fix Preserve batch discussion hash in notifications Preserves the URL fragment when navigating to batch discussions from notifications.
- refactor Target frappe v15 and v16 on the stable line Re-targeted main-hotfix at frappe v15/v16 instead of v17-only pins inherited from develop.
- refactor Pin version-15 line to frappe v15 LMS version-15 branch now restricted to frappe v15.
- refactor Pin version-16 line to frappe v16 LMS version-16 branch now restricted to frappe v16.
- refactor Add version-15-hotfix backport rule LMS now routes version-15-hotfix backport PRs correctly.
- refactor Migrate crowdin sync to crowdin/github-action Crowdin sync migrated from GitHub integration to Crowdin Action for reliability.
- refactor Pin develop to frappe v17 LMS develop now requires frappe v17 instead of spanning v16–v17.
- refactor Add version-16-hotfix backport rule LMS now routes version-16-hotfix backport PRs correctly.
- refactor Complete Russian translation Completes Russian translation from 77% to 100% coverage (1895 strings).
- refactor Upgrade frappe-ui to 1.0.0-beta.69 Upgrades frappe-ui and lucide-static, applies v1 component API migration, and picks up espresso v2 color palette.
b
Builder
2 breaking · 2 new features · 5 fixes
- feat Add Staging status for pages Adds a Staging status for pages so they can be Draft, Staging, or Live with corresponding badges and filters.
- breaking Match the command palette backdrop to other dialogs Command Palette had a custom backdrop while the Keyboard Shortcuts modal used the default, breaking visual consistency.
- breaking Upload favicons and meta images as public files Site favicon, page favicon and meta image uploads were private, breaking guest access and causing broken images.
- feat Open the template picker fully painted Template picker preloads thumbnails so cards appear fully painted on first open instead of loading on scroll.
- fix Let Bob edit components and make sync update pages Allows component editing via Bob and updates componentVersion pin when syncing instances.
See all 9 changes
- fix Stop settings modal from shifting on scroll Limits modal height and makes only tab content scroll so the settings modal stays fixed during scrolling.
- fix Escape route variable values rendered in the route preview Prevents XSS by escaping route variable values that are interpolated into HTML rendered in the page title preview.
- fix Show creation timestamp when sorting pages by Last Created Shows creation timestamp on page cards when sorted by Last Created instead of always showing last modified.
- fix Select the arrowed-to option with Enter in autocomplete inputs Fixes Enter key to select the highlighted autocomplete suggestion instead of submitting typed text.
- feat Add json_value and read valid JSON without normalizing Adds json_value function to query builder for reading JSON without normalization.
- feat Telemetry event catalogue and the events that answer its questions (backport #1408) Version 3 backport of telemetry event catalogue.
- feat Telemetry event catalogue and the events that answer its questions Insights now ships telemetry event catalogue documenting shipping section events with performance and query metrics.
- feat Notify admins of an Insights release with security fixes Insights admins now see security update notices in the sidebar, not just in Desk.
- feat Charts render through frappe-ui charts v2 Integrates frappe-ui's chart library for consistent rendering, number formatting, and currency display across number cards, bar charts, and other visualizations.
See all 17 changes
- perf Run the same semgrep rules in the pre-push hook and CI Pre-push hook now runs the same semgrep rules as CI, blocking new findings instead of old ones.
- fix Infer json_extract types from non-null values Fixes type inference for json_extract to use non-null values instead of treating JSON null as Decimal.
- fix Row limit and pivot counts v3 migrator was losing half of migrated table rows and miscounting pivot aggregations from v2 workbooks.
- fix Read valid JSON rows without normalizing in json_value JSON normalization regex was corrupting valid documents and causing 3x slowdown on data store queries.
- fix Number card retry placement and result row count copy Failed number card's Retry button was hidden, and result row count display was missing the actual count value.
- fix Dashboard filter picker and number card title Dashboard filter operators now default correctly, and unticked filters no longer remain applied.
- fix Store a chart config in one shape, instead of repairing it on load Chart configs are now stored and validated once instead of repaired on every load.
- fix Blank a non-finite value before the result is cached Non-finite values now blanked before caching to prevent deserialization failures on both versions.
- fix A division by zero returns null, as on the live connection Handles division by zero in DuckDB to return null instead of infinity, matching live connection behavior.
- fix Stack bars beside a right-axis line, and drop cleared axis bounds Restores stacking for bars when an SLA line is on the right axis and drops empty axis bounds on load.
- refactor Merge `version-3-hotfix` into `version-3` Merged hotfix branch into version-3.
- refactor Develop is 4.0.0-dev Insights develop versioned as 4.0.0-dev.
p
Press
1 new features · 10 fixes
- feat Warn on capitalised email and lowercase it on login Login now warns on capital letters in email and normalizes it, matching signup behavior.
- fix Bind search string in parquet lookup Binds binlog search strings as parameters to fix malformed queries containing quotes.
- fix Limit Wazuh update scope Wazuh updates were applying across all hosts instead of targeting the specific server.
- fix Add purge binlog action to server overview query Site action dialogs failed to open because purge binlog wasn't whitelisted in the Server Overview query.
- fix Restore configs truncated by a full disk or a reboot Config files were restored truncated after disk-full incidents, causing sites and benches to fail on restart.
See all 11 changes
- fix Draw analytics chart lines at 1px Dense analytics charts (CPU, Load Average) had overlapping 2px lines that hid each other, making them unreadable.
- fix Sync upstream-added domains to site config Domains activated via upstream path were routed by nginx but never written to site config.
- fix Refuse a table restore when the site answers requests Prevents table restore when the site is responsive to avoid overwriting user data entered during maintenance mode.
- fix Build the agent endpoint link from the real agent URL Constructs the agent endpoint link from the real agent URL to work correctly behind NAT and on non-standard ports.
- fix Show the shared badge on the server page to every user Shows the Shared server badge to all users, not just support staff.
- fix Hide Update Available while Restore Tables shows Hides the Update Available button when table restore is needed to prevent confusing update prompts.
o
Other
1 breaking · 61 new features · 8 speed-ups · 78 fixes · 34 refactors
- breaking Resolve the job timeout without ever failing the enqueue Hardens job timeout resolution to handle JSON arrays, string values, and missing keys without breaking the enqueue path.
- feat Add AWS server support Adds AWS as a server provider for Atlas regions with infrastructure, catalog, server operations and bootstrap configuration.
- feat Feat(tokens)!: one canonical design-token source, exported from frappe-ui/tailwind/tokens Restructures design token pipeline with one canonical source and public API for token access.
- feat Scheduled message Adds scheduled message functionality to Raven with UI controls for scheduling messages.
- feat Reminders Adds reminders feature to Raven with visual scheduling interface.
See all 182 changes
- feat Release v3 feat: release v3
- feat Pick the trial image by its Frappe version Adds SIGNUP_IMAGE_TAGS configuration so signups land on a known Frappe version build.
- feat Integrations settings panels Ports Webhooks, Message Actions, and Document Notifications settings panels from Raven v2.
- feat Sort on a value returned by the column Adds sortValue column option so columns can sort on a derived value instead of displayed content.
- feat Server restart and sync + site trial Adds server restart, sync, and site trial features to Central.
- feat Sync Accounts action on User Settings Adds button to User Settings form to manually sync JMAP accounts.
- feat Add host supply and strategy trials Adds configurable VM placement with provider host expansion and reproducible strategy trials.
- feat Feature/credit decisioning Adds credit decisioning engine for Loan Leads with rule-based approval logic and decision tracking.
- feat Service & Auth Integration Integrates service and authentication systems in Central.
- feat Retry dead tasks feat: Retry dead tasks
- feat Add webhook registry endpoint feat: Add webhook registry endpoint
- feat Add stop image build button feat: Add stop image build button
- feat Configure Central webhooks Central-only endpoint configures signed Atlas webhook deliveries with stable payload contracts and retry policies.
- feat Bake the domain provider into the pilot image Pilot image now includes the domain provider for direct custom domain routing without per-region setup.
- feat Let pilot register verified domains Pilots can register verified custom domains with DNS record validation, storing the route on Central.
- feat Add provider-defined domain route policies Providers can define TLS termination and proxy behavior for each route policy accepted during domain registration.
- feat Check and subscribe the app to the WABA webhook WhatsApp account form can verify webhook subscription and fix it in one click if the app wasn't subscribed.
- feat Resize servers through Atlas Customers can resize servers via Central, which stops the VM, applies compute and disk changes, then restarts.
- feat Route site and custom domains through the regional proxy Central can route sites and custom domains through the regional Atlas proxy, recording route state and failure reasons.
- feat The code editor family at frappe-ui/code-editor CodeMirror 6 component family with engine, renderless component, and kit at frappe-ui/code-editor.
- feat The code editor family at frappe-ui/code-editor ADR and spec for redesigning CodeEditor as a family supporting multiple use cases and rendering contexts.
- feat Add helpers to rename a server admin domain and a site Central helpers let operators rename admin domains and sites on a server through the Pilot API.
- feat Create servers through durable regional operations Central creates servers on configured regions via durable operations that record state before dispatch, preventing double-creation.
- feat Add bind mount overrides for docker volumes Docker compose now supports bind mount overrides for volumes without requiring compose file customization.
- feat Add Suite command palette Suite now has a command palette with contextual search, app navigation, creation actions and consolidated commands.
- feat Shared calendars Calendars shared from other accounts appear under Shared Calendars without switching accounts, read-only with full permissions control.
- feat Create, edit and delete calendars Users can create, rename, recolor, set default and delete calendars from sidebar or settings, with color persistence.
- feat Edit properties for multi select Bulk editing in Slides now supports stroke width, shadow, opacity, borders and text properties across selections.
- feat Keyboard shortcuts dialog Calendar has a keyboard shortcuts dialog opened with `?` or from sidebar menu, with `E` to create events.
- feat Serve small, cacheable template thumbnails to the picker Builder Hub serves small cacheable thumbnails alongside full preview images for faster picker rendering.
- feat New state delivery wire up Integration for new state delivery events from Atlas servers.
- feat Keep a Mail Domain out of the hourly DNS verification Mail Domain can skip scheduled DNS verification so hand-verified domains aren't unchecked by the hourly job.
- feat Fall back to the admin password when a target has no API key Targets authenticate with stored admin password when API key is missing or lost, improving resilience.
- feat Add firewall support Virtual machines now support configurable firewalls for public and mesh traffic with stateful IPv4 and IPv6 filtering.
- feat An app switcher, mail's search in the title row, and the suite as one PWA Mobile apps now have a unified app switcher with the suite as one PWA and mail's search in the title row.
- feat Mobile layout, event cards and agenda view Calendar now supports mobile layouts with month, week, day, and agenda views; events display as bottom sheets on phones.
- feat Respect the 24-hour customer service window in the composer Composer now respects Meta's 24-hour customer service window and requires templates to reopen conversations.
- feat Return variable mappings from get_sendable_templates Template variable mappings now return with sendable templates so users can preview and fill variables before sending.
- feat Support fractional CPU entitlements Virtual machines now support fractional CPU sizes from 100 to 32000 millicores with exact systemd CPU quota enforcement.
- feat Oversubscribe virtual CPUs on a host Hosts now oversubscribe CPU while placing VMs based on available memory and storage only.
- feat Keep tenant addresses with a reserved flag Public IPv4 addresses now persist on reserved flag; unreserved addresses return to the shared pool when detached.
- feat Add Atlas Tag labels and unlink virtual machines from their image Resources now use arbitrary key-value tags instead of fixed fields; virtual machines no longer hold links to their boot image.
- feat Add Atlas signing credentials Central can now issue Atlas regional credentials with Ed25519 signing while preserving Pilot and service authentication.
- feat Assign permanent team tenant ids Central Teams now have permanent numeric tenant IDs for Atlas network isolation.
- feat Add cmd+k command palette Wiki now has a command palette (⌘K) for cross-space page search and navigation.
- feat Default All Spaces filter to Published and group unpublished spaces All Spaces view now defaults to Published filter and groups unpublished spaces in their own collapsed sidebar section.
- feat Add getting started and troubleshooting guide WhatsApp app now has getting started and troubleshooting documentation for site admins.
- feat Send on enter and break the line with shift+enter Composer now sends on Enter and breaks lines with Shift+Enter like standard messaging apps.
- feat Soften the reaction chip border and add a hover fill Reaction chips now have softer styling with hover fill to indicate interactivity.
- feat DKIM keys under fixed selectors that never rotate Domains keep automatic DKIM management with fixed selectors and rotation pinned a century out for stable records.
- feat An Agenda view, and the grids at phone width Calendar library now supports Agenda view and responsive grid layouts at phone width with 52 clean commits.
- feat Find and label images by their tags Cargo now finds Atlas images by tag and labels Pilot images for later search.
- feat DateCalendar, DateRangeCalendar, PickerShell on Popover Adds standalone DateCalendar and DateRangeCalendar components, rebuilds three date pickers on them, and introduces PickerShell on Popover with manual trigger and auto-focus control.
- feat Setup central for humans and agents Establishes contribution guidelines for both human and agent developers.
- feat Warm the Pilot admin before the snapshot Admin is now warm in memory snapshot by reading bind config and probing its API before snapshot is taken.
- feat Verify remote tokens from an on-disk JWKS cache Added JwksCache to persist issuer public keys on disk; remote tokens now verify from cache without network fetch when key is present and cache is fresh.
- feat Prewarm Frappe memory snapshots One-shot Pilot boot service in baked images performs real Frappe login and Desk load before Atlas captures warm memory snapshot.
- perf Cleanup Legacy & Service integration Removed legacy service logic and updated service integration on a case-by-case basis.
- perf Skip stories in content globs Tailwind content globs now skip story files, reducing final bundle size by 26%.
- perf Refactor(ui)!: freeze data, dialog, input, shell, and page header APIs Freezes API contracts for data fetching, dialogs, toasts, inputs, shells, page headers, and color schemes in v1.
- perf Refactor(ui)!: freeze editor, packaging, and token contracts Finalizes editor option types, package and build contracts, and token contract with named types for compile-time safety.
- perf Refactor(base)!: normalize base component props Normalizes base component props with canonical names and simplifies Progress and Divider configurations.
- perf Refactor(navigation)!: use route and href for destinations Standardizes destination props to `route` for Vue Router and `href` for plain URLs across navigation components.
- perf Refactor(editor)!: name suggestion components and menu size Renames suggestion component props to `nodeView` and `listComponent` with explicit roles, standardizes menu size prop.
- perf Refactor(ui)!: finalize overlay navigation and list APIs Finalizes overlay slot APIs with predictable names (`open`, `setOpen`, `close`), standardizes delays, and updates component names.
- fix Verify Central tokens during bootstrap Uses staged IMDS JWKS issuer during bootstrap window, then persisted configuration after completion.
- fix Resolve site routes by any claimed hostname Resolves Admin API routes using site directory name, custom domain, or pre-rename hostname.
- fix Resolve renamed sites in login endpoint Resolves retained old hostnames to the renamed site in login endpoint and returns current site URL.
- fix Skip the site alias while the bench has no site Makes --site-pattern optional by skipping alias while bench has no site so Central setup succeeds at provisioning.
- fix Claim routed Pilot admin hostname Claims routed Pilot admin hostname after a server reports its routed gateway.
- fix Keep routed hostnames out of the proxy map Treats auto-routed VM hostnames as live instead of making proxy calls for them.
- fix Cache the IP country with the Frappe cache API Fixes get_country_from_ip cache call to use the Frappe cache API correctly, restoring welcome credits for new teams.
- fix Keep the staging clone when a VM is released Promotes dependent staging clones instead of destroying them so snapshot uploads survive VM deletion.
- fix Retry the site sign-in faster Reduces initial login retry delay from 2 seconds to 1 second for faster site readiness confirmation.
- fix Send state updates only on a status change Adds webhook condition to send Virtual Machine State deliveries only on insert or status change.
- fix Allow Retry Transfer for System images Allows Retry Transfer action for failed System image transfers, not just Machine images.
- fix Accept a delete of an image already retired Makes image delete idempotent by accepting 202 for images already Archived or Deleting.
- fix Preserve pending capacity response Documents the 503 pending capacity response and regenerates the Atlas API client for typed error handling.
- fix Delete workflows with the document they link to Allows documents with workflows to be deleted by removing dynamic links when workflows are deleted.
- fix Install the deprecated timezone names Installs tzdata-legacy on Pilot images to support deprecated timezone aliases for sites upgrading to Ubuntu 24.04.
- fix Invite mail goes out with CRLF line endings Sends calendar invites with CRLF line endings to pass DKIM verification and land in inbox instead of junk.
- fix Sync participant state after reconnect Broadcasts participant media state to existing viewers after reconnect to keep indicators in sync.
- fix An invite email names the occurrence it is about Renders recurring event rescheduling emails from the occurrence's view with override folded in.
- fix Restore unload warning Restores native unload warning for dirty editable presentations while preserving draft save behavior.
- fix Restore navigation and palette actions Restores Writer new-document command palette action and fixes Vite navigation by prebundling feather-icons.
- fix The domain field is there before the domains arrive Initializes domains resource with empty array so domain fields appear in mail dialogs before data arrives.
- fix Use room ID in untitled recording emails Uses room ID instead of generic untitled label in recording notification emails when Meet Room has no title.
- fix Use app dialog for leave confirmation Removes browser-level beforeunload warning from Meet in favor of standard Frappe UI leave confirmation.
- fix Centre emojis in their grid cells fix(emoji-picker): centre emojis in their grid cells
- fix Stop the quoted-by badge scrolling posts and tables fix(quotes): stop the quoted-by badge scrolling posts and tables
- fix Show newly created spaces at the top of the sidebar Newly created spaces had NULL `last_edited` timestamps and were invisible in the sidebar on sites with 50+ spaces.
- fix Clear the bench cache after an admin domain change Frappe cached site config prevented `pilot_endpoint` from updating, so sites still pointed to the old admin domain.
- fix Use https for a wildcard admin endpoint Admin endpoints under wildcard domains were incorrectly falling back to HTTP instead of using HTTPS at the edge.
- fix Name the certificate domain when issuance fails Certificate issuance errors reported the site hostname instead of the actual domain being issued.
- fix Keep the requested host on ACME challenges HTTP-01 ACME challenges for custom domains returned 404 at the proxy because the forwarded host was incorrect.
- fix Widen the wildcard suffix and the domain dialog Long wildcard suffixes and domain DNS tables were truncated in the New Site and Add Domain dialogs.
- fix Repoint pilot_endpoint when the admin domain changes Renaming an admin domain didn't update `pilot_endpoint` in site configs, leaving sites pointing to the old domain.
- fix Separate public site TLS from certificates Public site TLS state and origin certificate termination were conflated, preventing edge-terminated wildcard sites from working over HTTPS.
- fix Migrate ListFooter page length picker from removed buttons prop to options ListFooter page length picker rendered nothing after frappe-ui dropped the `buttons` prop from TabButtons.
- fix Fix!: picker open at mount, List select-all, Tabs reset, TabButtons.focus() Pickers mounted open had no draft, no aria-controls ID, and no focus move; List select-all, Tabs and other behaviors were broken.
- fix Remove misleading ⌘K hint from search slots example Combobox search example showed a misleading ⌘K hint that wasn't wired to anything.
- fix Blank print designer page when page_head is undefined Print designer page opened blank on Frappe v15 because `page_head` only exists from v16 onwards.
- fix Keep pilot admin sessions open for one hour Admin sessions opened from Central ended after 5 minutes, forcing frequent re-logins.
- fix Send cpu millicores and a disabled firewall to Atlas Central was sending vCPU count instead of millicores to Atlas, causing server creation to fail.
- fix Point Wiki desktop icon at /wiki-app on existing sites Wiki desktop icon on existing sites still pointed to the old `/wiki` path, returning 404.
- fix Template header color should inherit WhatsApp template header color wasn't inheriting from parent styles.
- fix Even though the docs say otherwise i am pretty sure this works Small fix despite documentation ambiguity.
- fix Validate spaces list in wiki space APIs Type validation prevents SQL injection when querying spaces.
- fix The Week grid's cursor, lucide SVGs that ignore their size, and a sheet warning Week grid cursor, lucide SVG sizing, and BottomSheet accessibility improvements.
- fix Lazy load S3 deps S3 dependencies now load lazily to avoid import failures.
- fix Match the host address in a port forward Guest VMs can now reach remote servers on ports 80 and 443 with corrected port forward address matching.
- fix Use the real fluent-bit install path, not a guess Log shipper no longer crashes on fresh installs by checking the actual fluent-bit installation path.
- fix Tail bench log dir only, not the site mirror Bench-level logging no longer duplicates site-level log lines in datum.logs.
- fix Fix(TreeView)!: expansion is a keyed model, not a write to your nodes Tree expansion state is now managed as a keyed model instead of writing to caller nodes, fixing shallow watchers and undo logs.
- fix Cap memory for asset builds Asset builds that exceed memory limits now fail gracefully instead of being killed by the kernel.
- fix The title inset's variable survives Tailwind Mobile page header title inset CSS variables now compile correctly through Tailwind and lightningcss.
- fix Scroll rail to keep active heading visible Table of contents now scrolls to keep the active heading visible.
- fix Clear tree cache when a space route is renamed Space route renames now clear the sidebar tree cache, fixing stale 301 redirects.
- fix Store events in the database during ingest Pulse events now persist to the database immediately, with 503 on failure to trigger client retries.
- fix Make each WireGuard peer routable WireGuard mesh tunnels now route correctly between hosts with proper address prefixes.
- fix Wait for space capabilities before opening a change request Read-only users no longer enter change request mode and see perpetual loading skeletons.
- fix Don't mark spaces with the All role as restricted Spaces with only an "All" role no longer show a restricted lock icon.
- fix Report skipped coverage as unchanged Suite CI now reads coverage from completed test steps and reuses base-branch coverage only for intentionally skipped suites.
- fix Hover styles only where hovering is possible Hover styles now only apply on devices that support hovering, fixing ghost hovers on touch screens.
- fix Disable the VTS module by default Nginx VTS module now disabled by default, removing unused shared memory overhead and metrics dumps.
- fix Allow page titles longer than 140 characters Changed `title` field from `Data` to `Small Text` on Wiki Document and Wiki Revision Item to accommodate titles over 140 characters.
- fix Edits lost on save Implements web locks to prevent concurrent edits, prevents stale saves from overwriting edits, and maintains correct state across multiple tabs.
- fix Misc editor fixes Fixes slide deletion navigation, transition duplication on paste, and Cmd+X to remove and copy elements.
- fix Stabilize raised hand E2E selector Exposes raised-hand indicator through accessible label and updates E2E assertions.
- fix Use consistent tooltips Replaces native title hover text with frappe-ui Tooltip components for consistent styling.
- fix Improve mobile overflow controls Moves meeting information to mobile overflow menu and shows it in a mobile-friendly dialog.
- fix Show audio indicator in preview Shows local microphone audio indicator in the meeting preview and publishes replacement stream after microphone switches.
- fix Animate audio bars with transforms Uses center-origin transforms for audio bar animation instead of interrupted height transitions.
- fix Adapt shopping cart to erpnext permission checks Updates cart to use TaxService and create sales transactions as Admin to bypass permission checks on Item and Account.
- fix Stop /g writing an Error Log per git call Prevents git operation errors from creating error logs that can cascade into infinite loops.
- fix Path to redisearch docs fix: path to redisearch docs
- fix Add translation of address_picker_card.html fix: add translation of address_picker_card.html
- fix Login and translation in macros.html fix: login and translation in macros.html
- fix Send a valid prewarm login request Prewarm login lacked site Host header and valid JSON body, so desk and admin remained cold in snapshot; request now properly formatted.
- fix Reset guest DNS and time sync after resume VMs resumed from snapshots waited 40 seconds for DNS and clock sync; now resets these services immediately after resume.
- fix Write back guest disk flushes Firecracker defaults to Unsafe cache type which discards guest flushes; switched to Writeback so files written before snapshot are persisted.
- fix Narrow the JWKS cache record before the staleness check Type checking issue where mypy rejected passing potentially-None cached record to staleness check; now validates non-None before lookup.
- fix Keep the socket-activated admin alive for 10 minutes Admin idle timeout of 60 seconds caused it to stop before snapshot was taken; raised to 10 minutes so admin remains warm in memory.
- refactor Single telemetry configuration Collapses [datum] and [logs] into single [telemetry] section with one endpoint and token from Central.
- refactor Solidify auth & fake proxy Verifies issuer while decoding token and adds fake proxy for testing.
- refactor Authentication Verifies region ID via audience ID check and issuer in token, dropping public key authentication.
- refactor Add skills for building studio apps Adds RULES.md and DESIGN.md documentation for building Studio apps with agents.
- refactor Improve technical writing rules Adds technical writing guidelines extracted from William Zinsser's _On Writing Well_.
- refactor Delete v2 chore: delete v2
- refactor Cover the delete of an image already retired test(vm): Cover the delete of an image already retired
- refactor Clean frontend & make it responsive etc Improved Settings Dialog with better contrast, card buttons for theme toggle and responsive layout.
- refactor Speed up query building PyPika query building now offers validation bypass and skips `__hash__` calls for 2-3x speedup on large queries.
- refactor Datum Server into singles & clickhouse password rename Refactored Datum Server and renamed ClickHouse password variable for clarity.
- refactor Move pilot image creation to different doctype Separated pilot image creation from other one-click images for future service expansion.
- refactor Single setup script on atlas & Service endpoints Consolidated setup script and cleaned up cargo service endpoints.
- refactor Bump version to 3.2.1 Set version to 3.2.1 in wiki/__init__.py and package.json.
- refactor Release v3.2.1 Merged develop into version-3 for v3.2.1 release.
- refactor Replace MinIO with SeaweedFS for S3 backups Switched test setup from MinIO to SeaweedFS for S3-compatible storage.
- refactor Follow post-commit callback contract Aligned WebDAV promotion-failure expectations with Frappe's logged post-commit callback failures.
- refactor Rename DATUM_CLICKHOUSE_PASSWORD to DATUM_USER_PASSWORD and require it Renamed environment variable for clarity since datum needs three passwords.
- refactor Unify app settings Centralized reusable Suite dialog for profile, preferences, and workspace settings across Calendar, Drive, Mail, and Meet.
- refactor Unify keyboard shortcuts Keyboard shortcuts now use the Frappe UI shortcut registry across Drive and Mail instead of custom implementations.
- refactor Size every CPU value in millicores CPU values now consistently use millicores throughout spawn configs and Atlas calls.
- refactor Share review guidance and organize branding assets Review guidance consolidated and organized to avoid duplication between Barista and Greptile.
- refactor Version develop as 1.0.0-dev WhatsApp develop versioned as 1.0.0-dev.
- refactor Merging develop into version-3 Routine merge of develop into version-3 branch.
- refactor Prioritize staging signup and servers Central specification prioritizes signup and server lifecycle for Friday milestone.
- refactor Sync translations from crowdin Automated translation sync from Crowdin.
- refactor Add proxy mappings for datum Cargo proxy mappings now include datum.
- refactor Remove stale expired-permissions scheduled jobs during migration Cleanup patch removes obsolete Drive scheduled job from upgraded sites.
- refactor Add lightweight agent guidance and spec conventions Adds agent guidance for frontend and backend development with spec naming and triage vocabulary.
- refactor Mutations are harmful should be confirmed always docs: mutations are harmful should be confirmed always
- refactor RC API audit, decisions, and execution plan Documents frappe-ui v1 release-candidate API audit, grilling pages, and execution plan.
- refactor Convert db.sql calls for broader database support Converts db.sql calls to support PostgreSQL in addition to MariaDB.
- refactor Add dependencies Adds missing Bench dependency required by Frappe Cloud.
- refactor Update project configuration ci: update project configuration
- refactor Add Consistent padding and gaps across all pages refactor(ui): Add Consistent padding and gaps across all pages