Weekly report
Frappe and ERPNext changes, 21 Sep to 27 Sep 2026
379 changes merged: 2 breaking, 97 new features, 13 speed-ups, 228 fixes, 39 refactors.
Breaking changes
Read these before you update. They can change how your site or app works.
- breaking Keep image caption styled when soft breaks render as <br> Image captions lost their italic style because soft breaks between image and caption rendered as `<br>`, breaking the CSS selector.
- breaking Feat(Sidebar)!: settle five sidebar family behaviours before 1.0 Settles SidebarItem icon behavior, attribute split, nav landmark, and other family-wide inconsistencies with breaking changes before 1.0 release.
Highlights
Show the open folder's pages above the layers tree
builder · feat
Open a DocType's declared replacement page at its main address
frappe · feat
Open every record on Details, and draw skeletons while content loads
frappe · feat
Keep canvas zoom and pan when switching pages
builder · feat
Open CRM Lead and CRM Deal on Activity
crm · feat
Label the components panel
builder · feat
- feat Open a DocType's declared replacement page at its main address A DocType can replace its record or list page with an app's own page; main address opens the declared replacement, standard page at second address.
- feat Open every record on Details, and draw skeletons while content loads Record page opens on Details for every doctype; desk v2 draws skeletons instead of spinners while regions load.
- feat Float the record composer in the shell The record page composer now floats in a window, staying visible as the reader navigates to other pages.
- feat Email writer in the record composer A built-in email writer on `page.composer` lets readers send emails directly from the record page; sent emails appear in the feed at once.
- feat The composer band and the comment writer on the record page A composer band at the bottom of Activity and Emails tabs lets readers write comments; a `page.composer` list lets Client Scripts open it by name.
See all 92 changes
- feat The activity feed on the generated record page The generated record page now draws real Activity, Emails and Files tabs with live content; Client Scripts can read and extend the feed.
- feat Draw the record tab strip on the generated page The generated record page now draws its own tab strip; Client Scripts can switch to named tabs, and the reader's tab lives in the address.
- refactor Merge develop into desk-v2 Sixth sync of develop into desk-v2, bringing the `ui/` half of the frappe-ui 1.0.0-rc.1 bump.
- feat Paint a returning record from the shared cache Record pages now paint instantly on return visits from the shared in-memory cache before a quiet background refresh.
- feat Per-field date format for Date and Datetime fields Date and Datetime fields in print formats now support per-field date format via inspector with live preview.
- feat Feat!: backport new print format builder New print format builder with Classic builder option; WeasyPrint becomes explicit deprecated renderer.
- feat Record page paints once Record page paints once by fetching scripts early and drawing them once per handler; slow scripts have a 500ms timeout.
- feat The page name-clash check in the router, the build and the server One URL segment after an app prefix can belong to a page, DocType or module; name clashes now checked, DocType/module always kept.
- feat Let users choose the import type Import type selector added to New Data Import dialog; Update Existing and Insert or Update are now reachable from UI.
- feat Shared data cache for records and lists, fed by the API wrapper In-memory data cache added for records and lists in @framework/ui; API v2 wrapper feeds it from every response.
- feat Find and resolve replacement page declarations Build finds pages that replace a DocType's record or list page and resolves which one wins.
- feat Refetch meta, form layouts and list settings after a DocType change Desk v2 now listens for `doctype_update` and drops memos for that DocType, so Customize Form changes take effect immediately.
- feat Second addresses for the standard list and record page New addresses `/:doctype/view/list` and `/:doctype/view/record` for standard pages; saved views moved under list kind.
- feat Allowlisted pilot passthrough `pilot_request` allowlisted pass-through to pilot for Cloud Settings features like backups.
- feat App-built page islands and sidebar item routes `assets.json` is now the island registry; apps declare page islands built as entry assets, islands kept if app is installed.
- feat Private shell Private shell lets users craft their own shell.
- feat Support using an Email Template for content Notifications can now link an Email Template for dynamic subject and message content instead of inline text.
- feat Add frappe.ui.form.set_controller `frappe.ui.form.set_controller(doctype, ControllerClass)` now registers class-based form controllers without needing to extend `cscript`.
- feat Pass the form to link query functions Link and Autocomplete controls now pass the form as a fourth argument to query functions, letting them act on the form without reaching for `cur_frm`.
- feat Let a Filter host choose its fields and popover alignment `Filter` components now let the host pick fields and declare custom ones, and choose popover alignment.
- feat Drop the field template section from the print format builder library feat: drop the field template section from the print format builder library
- feat Collaboration writes go to /api/v2 document sub-resources Routes assign, share, tag, favourite, follow, and comment operations through /api/v2 sub-resources instead of legacy endpoints.
- feat Split view in report view Adds split-view option in report view to display linked documents side-by-side, enabled via user settings.
- fix Prevent File.optimize_file from operating on a mismatched file_url Prevent File.optimize_file from operating on a mismatched file_url
- fix Five open print issues Print Settings font size was overridden by Redesign style, default layout ignored Tab Break.
- fix E2E findings on the new builder renderers Email attachments carried wrong letterheads, classic format migration lost settings, Typst renderers had incomplete coverage.
- fix Child table row closes after uploading or clearing a file Uploading/clearing files in Attach fields collapsed open rows, forcing reopens for multi-field edits.
- fix Start the preview overlay at the page head's real bottom edge Print format preview started below the page head; backdrop also failed to paint due to Chromium rendering issue.
- fix Don't show an error for a deleted Number Card Missing Number Card on a dashboard left an error message even though the card was handled gracefully.
- fix Drop :where() from the standard cell rule for wkhtmltopdf wkhtmltopdf's WebKit dropped the entire table cell rule, losing padding and alignment in PDFs.
- fix Do not write unset settings back on settings dialog Do not write unset settings back on settings dialog
- fix Disable automation queue toast Background Task toasts appeared for silent automation runs.
- fix Follow-ups from end-to-end testing of the print format builder Classic format conversion lost section headings, margins, fonts; Chrome PDFs skipped pages; print previews misdated.
- fix Skip stale Custom DocPerm entries in File permission query Skip stale Custom DocPerm entries in File permission query
- fix Adding right align support in embedded list column Adding right align support in embedded list column
- fix Phone fields and fields without fieldname lose defaults Currency fields without a fieldname shared one key in form data, so each overwrote the previous; phone fields with a default like "+91-" showed empty with no country code.
- fix Setting the deprecated role profile field applies no roles A user created with only `role_profile_name` set got no roles because the field was cleared before it moved into `role_profiles`; the move now only happens when the caller changed it.
- fix Close the Typst and page-break gaps against Chrome Typst-rendered formats had newlines after `<br>`, missing list markers, wrong default font, and collapsed aligned sections; now match Chrome and HTML preview.
- fix Direct links are dropped when a child table links the same doctype `get_linked_fields` dropped direct links when the same doctype also linked through a child table, so linked documents through the header went missing.
- fix Oauth discovery advertises http urls behind an https proxy `/.well-known/openid-configuration` advertised http URLs behind an SSL-terminating proxy; now respects `host_name` in site_config.json.
- fix Parse numbers using the user's number format Importing CSV with decimal-comma numbers (e.g., 19,18) silently corrupted them by stripping the comma, saving 1918.0; now explicitly parses using the user's active NumberFormat.
- fix Errors and cron check-ins from jobs never reach sentry rq ends work horses with `os._exit`, which skips Sentry SDK's atexit flush; anything in the transport queue is dropped; now calls `sentry_sdk.flush()` before teardown.
- fix Keep no-value fields out of the default layout Fresh default layout picked up every labelled field including no-value fields like Tab Breaks; now skips them in both JS and Python.
- fix Keep h3 and h4 bold in print view and pdf Headings lost bold in print after the global `h3, h4 { font-weight: bold }` rule was dropped; now added to print.bundle.scss only.
- fix Do not lose edits when an autosave fails Failed autosave was silent; page left after a failure silently discarded edits; now reports the failure, re-arms autosave on the next edit, and flushes before leaving.
- fix Read the letter head zone source from what it renders Letter head HTML zone showed **Image** in the builder even with HTML content; now treats a zone with content but no image as HTML.
- fix Datetime direct usage to prevent Meta dependency `add_to_date` led to recursive `Meta(__doc__)` calls during `Meta.__init__`; now uses datetime directly.
- fix Stop the import-list search box from collapsing Status select on the import list stretched to form height; now wrapped in fixed-width container.
- fix Preventing meta dependency in the check_if_large_table Large table check triggered Meta recursion; resolved by preventing Meta dependency.
- fix Bring version-16-polished CI back to green Kanban endpoints, duration picker, saved layout restoration and Cypress helper fixes.
- fix Show formats created before print_format_for existed Old print formats with NULL print_format_for were hidden from the picker; now treats NULL as DocType.
- fix Sort Link columns by their title Link columns for doctypes with "Show Title in Link Fields" displayed title but sorted by name; now passes sortValue hook for title-based sorting.
- fix Duplicate doctypes in the user permission applicable for list Applicable for list repeated a child doctype per parent or table reaching it; now drops duplicates and fixed pagination slicing.
- fix Keep the builder away from file-backed standard formats Standard formats whose HTML ships as a file had the Edit Format button even though the builder cannot edit them.
- fix Sorting by the status column after resizing it throws Sorting list view by a resized status column threw because column width changes broke the sort index.
- fix Remove orphaned navbar search `/search` route was removed but navbar form still submitted to it; removed the orphaned form.
- fix Hide db-column-only field properties for no-value fieldtypes Index, Unique and Not Nullable checkboxes showed for Table, Section Break, HTML, Button fields; now hidden.
- fix Stop password reset flow from bypassing 2FA Password reset now respects 2FA settings, closing a hardening gap in the login flow.
- fix Store hashed session ids Session IDs are now hashed in storage (`tabSessions` and cache); only the client cookie holds the raw sid, so a database breach no longer exposes active session tokens.
- fix Generate print_by_server temp file path server-side Temp file paths for server-side printing are now generated server-side instead of accepting arbitrary `file_path` input.
- fix Add perm. conditions in perm. hooks Permission hooks now include comprehensive permission checks, preventing unauthorized report access.
- fix Skip invalid GitHub release tags `check_for_update` no longer fails on non-semver release tags and now strips leading `v` before parsing.
- fix Accept a dict as the on_parent target `get_mapped_doc` now handles dict `target_doc` in the `on_parent` branch, fixing mapping into child rows of dict parents.
- fix Mark notification as read when clicked Clicking an unread notification now marks it read, clears its dot and lowers the badge count.
- fix Render relative links to avoid storing hardcoded absolute url Relative links are now rendered instead of storing hardcoded absolute URLs.
- fix Menu stays open after navigating back Dropdowns now close when `frappe.router` fires `change`, preventing menus from floating over the new page after a back-button navigation.
- fix Stop two test state leaks that fail unrelated v16 tests Two tests that leaked state into later shards are now fixed.
- fix Edge case in the new routing Fixed an edge case in the new routing where Audit trail in India Compliance was causing issues.
- fix Catch up on writes made while a build ran Search index builds now catch up on writes made during the build, preventing stale text in results.
- fix Print format builder folds the sidebar instead of hiding it The print format builder now folds the sidebar to its icon rail instead of hiding it, keeping navigation available.
- fix Hide the print format builder flag fix(print): hide the print format builder flag
- fix Update IntermediateStepModal to new Dialog API fix(ui): update IntermediateStepModal to new Dialog API
- fix Drop Beta from the print format builder field label fix(print): drop Beta from the print format builder field label
- fix Attribute document events to the doctype's app fix(telemetry): attribute document events to the doctype's app
- fix Double fetch calls on sending email and broken socket connection Moves activity timeline subscription to a shared store with reference counting, coalesces duplicate refreshes, and restores socket rooms after reconnection.
- fix Canvas renders author html and zones the way the print does Brings HTML block canvas rendering and print rendering into agreement by applying the same sanitization rules to both surfaces.
- fix Harden runtime and run pull request CI Enforces safe transaction boundaries for SQLite, retries background jobs, hardens document locking and setup callbacks, and adds SQLite to pull request CI.
- fix Doctype field editor labels the standard filter option differently Renames `in_standard_filter` label from "In List Filter" to "In Standard Filter" to match other UI surfaces.
- fix Restore blue selection ring and marquee Restores blue selection styling after accidental gray override.
- refactor Print format builder inspector uses desk tab buttons The print format builder's inspector now uses `frappe.ui.tab_buttons` for segmented controls and empty states, gaining arrow-key selection.
- refactor Bump frappe-datatable to 1.21.2 Pinned column offsets are now recomputed on column resize.
- refactor Drop the server script map after the permission query test test: drop the server script map after the permission query test
- refactor Keep table multiselect selection in sync keep table multiselect selection in sync
- refactor One layout model, one property registry, one row shell Unifies PDF builder layout traversal, consolidates field/multi-select inspector panels, and standardizes property write path.
- refactor Server-side visibility on the canvas, dead code and inspector nits Applies server-side `check_conditions` visibility on canvas instead of client-side evaluator, removes orphaned `clamp_column_width` and dead exports.
- refactor Re-review a pr when it is pushed to Triggers Greptile review on new commits and rebases; excludes Mergify backports and bot PRs.
- refactor Point greptile at the code review guide Configures Greptile with `.greptile/files.json` and `rules.md` to load code review guide, API rules, and context on every review.
- feat Revise quotations without cancelling Submitted Quotations can now create named revisions (like BOM versions) instead of cancel-and-amend.
- feat Add Remarks field to Purchase Order Add Remarks field to Purchase Order
- feat Subcontracting inward reports Three reports for Subcontracting Inward Orders: summary, raw materials to be received, finished goods to be delivered.
- feat Show invoice/payment/difference totals Payment Reconciliation now shows totals for invoice amount, payment amount and difference; updates live as rows are checked.
- feat Use template BOM for variant finished goods Variant finished goods without their own BOM now fall back to the template's default BOM in subcontracting.
See all 79 changes
- feat Serial and batch wise stock balance report Serial and Batch Wise Stock Balance report lists batch nos and serial nos per item with opening, in, out and balance qty/value.
- feat Put a customer on hold Customers can now be put on hold with a release date, blocking Sales Orders, Delivery Notes, Sales Invoices and POS Invoices until release, mirroring the Supplier hold feature.
- feat Email templates for customer-facing emails Proforma Invoices and POS receipts can now use Email Templates for subject and body, with templates receiving the document as context.
- feat Close and re-open blanket orders Blanket Orders now have a status (Draft, Submitted, Closed, Cancelled) and Close/Re-open actions; closed orders hide Create buttons and drop out of pickers.
- feat Close individual blanket order items Blanket Order rows now have Close Items and Reopen Items actions, letting rows stay closed while unordered qty remains.
- feat Make bank reconciliation dialog voucher types extensible The Bank Reconciliation Tool dialog now uses a registry so apps can add their own bank-affecting vouchers like Loan Repayments.
- feat GL-only reposting from Stock and Account Value Comparison report A **Create GL Reposting Entries** button queues `Repost Item Valuation` with `repost_only_accounting_ledgers` set, rebuilding the ledgers without touching valuations.
- perf Remove mapreduce connection from pcv Remove mapreduce connection from pcv
- perf Reuse putaway rule lookups for repeated items Repeated warehouse items now reuse UOM metadata and putaway rule cache within the action.
- perf Bulk load item details for sales forecasts Sales forecast now bulk-loads Item details in one query instead of separately per item.
- perf Reduce memory consumption during reposting Reposting no longer holds complete future ledgers in memory, queuing only identities and fetching full rows in batches to prevent OOM kills on smaller workers.
- perf Serve Item link search from an FTS5 trigram index Item link searches now use an FTS5 trigram index to narrow scans, dropping lookup time from 5-6 seconds to under a second on large catalogues.
- fix Open a blanket order without marking it unsaved Opening a submitted Blanket Order showed "Not Saved" and an Update button due to null-to-empty party field conversion.
- fix Release plan reservations when the plan completes Production Plans didn't recalculate reserved stock when completing, leaving stale reservations.
- fix Keep a closed production plan closed until it is reopened Auto status updates on a Production Plan silently reopened manually Closed plans.
- fix Show only company bank accounts in Bank Statement Import Show only company bank accounts in Bank Statement Import
- fix Explode phantom BOM rows by their stock qty Phantom sub-BOM rows exploded using display qty instead of stock qty, inflating component requests 1000x for unit conversions.
- fix Replace removed validate_import_file call in Bank Statement Import Saving Bank Statement Import threw AttributeError after Frappe's Data Import refactor.
- fix Offset plan reservations across warehouses Production Plan reservations didn't track when Work Orders used different warehouses, overstating reserved stock.
- fix Use Text Editor for fields that store HTML Delivery address and Asset fields stored HTML but were plain Text, printing with literal tags once frappe escapes them.
- fix Filter purchase register by supplier group from supplier master Purchase Register dropped older invoices when filtered by Supplier Group (unfilled fetch_from field).
- fix Use Text Editor for manufacturing descriptions copied from items Work Order descriptions copied as-is from Text Editor but stored in Text fields, printing with literal tags.
- fix Scope secondary items to job card Split Job Cards lost scrap rows when both used the same secondary item.
- fix Release the work order reservation before previewing a stock entry Stock Ledger and Accounting previews failed for Work Orders with Reserve Stock enabled.
- fix Refresh planned qty after work order status update Manufacture entries with process loss left stale planned_qty in Bins.
- fix Proforma Invoice fixes Proformas could be amended and recreated; descriptions lost between orders.
- fix Validate Proforma Invoice lines in the controller Proforma Invoices created via REST API skipped validation, allowing cancelled orders and mismatched amounts.
- fix Work order UX cleanup Work order UX cleanup
- fix Count only matched batches on work order reservations Batch-wise Work Order reservations blocked unrelated batches after moving a different batch.
- fix Keep customer shipping address on drop ship purchase order Company trigger replaced customer shipping address on drop ship POs when duplicating or changing company.
- fix Deadlock when setting item default income account Concurrent Sales Invoices deadlocked updating Item Defaults when rows were in different order.
- fix Show month names in user language in Customer Acquisition and Loyalty report Monthly report showed English month names for every user language.
- fix Create stock entry bundles before updating the work order Material Transfer for Manufacture didn't mark reserved batches as moved, blocking remaining stock.
- fix Count same-instant rows in dimension negative stock check Two rows of the same voucher both passed negative stock check because it only looked at rows with posting_datetime strictly before the current row; now uses <=.
- fix Set correct transaction type on args copy while evaluating item wise pricing rule Pricing rule evaluation on an args copy left the copied transaction type empty, so rules scoped to transaction type never matched.
- fix Restrict delivery to reserved serial nos when ensure delivery by serial no is set Delivery Note and Sales Invoice with Update Stock could deliver any serial no even when the Sales Order Item required specific reserved serial nos.
- fix Skip activities fetch on unsaved CRM doc Opening an unsaved CRM document fetched activities with no reference doc, so it threw.
- fix Respect permissions on sales and purchase invoice actions Sales and Purchase Invoice Create dropdown showed actions without checking permission to create the target document.
- fix Convert service cost to company currency Subcontracting Order service items were mapped straight from a foreign-currency Purchase Order with no conversion, adding supplier currency to company currency.
- fix Resolve scorecard variable paths in modules not yet imported `import_string_path` failed for paths into a submodule not yet imported; now imports the longest dotted prefix that is a module and resolves the rest as attributes.
- fix Drop unused serial balance from Stock Ledger Stock User without Serial/Batch Bundle write got PermissionError on Stock Ledger report when ledger rows stored serial nos as text; removed unused code.
- fix Use per-unit BOM qty for process loss receipt Process loss receipt multiplied lost qty by BOM's `stock_qty` (qty for whole BOM), not per-unit qty; now uses `qty_consumed_per_unit`.
- fix BOM UX cleanup BOM form layout and spacing improvements.
- fix Add permission checks to whitelisted methods and the DocPerm rows they need Backports six permission-checking fixes to v15-hotfix. Whitelisted methods on several doctypes now validate user rights before executing, preventing unauthorized access to doctypes like Material Request, Stock Entry, and others.
- fix Continuous raw material consumption with bom validation Manufacturing now compares the BOM against consumption entries when "Validate Components and Quantities Per BOM" is on, fixing validation failures on partial material consumption.
- fix Add permission checks to whitelisted methods and the DocPerm rows they need Backports the same permission hardening to v16-hotfix, affecting stock, accounting, and CRM workflows.
- fix Finish a work order after partial material consumption Work orders can now complete after partial Material Consumption entries when "Get Raw Materials Cost from Consumption Entry" is enabled, by excluding consumed materials from the Manufacture entry.
- fix Subtract consumption entries from available materials Return Components and backflush now correctly account for consumed materials, preventing proposals to return already-consumed material.
- fix Reset stale selected mode of payment on new invoice Intermittent POS invoices with `paid_amount = 0` and status Unpaid are now fixed by resetting stale Mode of Payment selections between invoices in a session.
- fix Quote the reversed row's rate on a consolidated credit note POS Closing Entry consolidation now correctly applies invoice-level discounts to reversed rows, fixing rate validation failures.
- fix Round running allocation balance in payment reconciliation Payment reconciliation now rounds the running FIFO allocation balance to currency precision, fixing "allocated amount greater than unadjusted" failures.
- fix Use preferred addresses in customer quotations Creating a quotation from a customer now uses the preferred billing and shipping addresses instead of the latest linked ones.
- fix Keep against voucher link in general ledger for non-english users General Ledger's Against Voucher Dynamic Link now renders as a link for non-English users instead of plain text.
- fix Translate doctype name values in report columns 36 report columns holding DocType names now render translations on screen and in print.
- fix Block Quality Inspection submit without a sample size Quality Inspection now requires Sample Size > 0 at submit (drafts still save with 0), preventing zero-sample inspections.
- fix Throw clear message when MRP purchase item has no default supplier Material Requirements Planning now throws "Default Supplier for {items} not found" before attempting to create a supplier-less PO.
- fix Stop ordering against an expired blanket order All Create buttons (Purchase Order, Sales Order, Quotation) and the item details picker now block expired Blanket Orders consistently.
- fix Count complete opening depreciation periods accurately Fixed straight-line depreciation to preserve month-end boundaries and count whole periods correctly.
- fix Report uae vat 201 sales vat in company currency UAE VAT 201 now reports foreign-currency Sales Invoice VAT in the company currency, matching the Sales Register.
- fix Add permission checks for serial/batch creation using scanning Serial/Batch creation via scanning now validates user permissions.
- fix Negative stock value for moving average items with mixed batchwise valuation Forward port of two hotfix PRs fixing Moving Average items whose batches mix batchwise and non-batchwise valuation.
- fix Job card cleanup fix(UX): Job card cleanup
- fix Production plan layout fix: production plan layout
- fix Skip ERPNext persona for HRMS signups fix: Skip ERPNext persona for HRMS signups
- fix Handle missing and item group default supplier in MRP make_order fix: handle missing and item group default supplier in MRP make_order
- fix Valuation of serialized items after disabling serial no wise valuation Fixes outward stock entries retaining per-serial rates through repost when disabling serial-wise valuation, restoring clean Moving Average calculation.
- fix Validate warehouse account belongs to selected company Prevents warehouse creation with an account belonging to a different company by validating account company on warehouse change.
- refactor Secondary items across split job cards Secondary items across split job cards
- refactor Add sample replacement pages for Report and Note Sample replacement pages for Report (record) and Note (list) apps that don't own the DocType.
- refactor Use frm instead of cur_frm in client scripts Client scripts, form controllers and shared helpers now use the form they are given instead of relying on `cur_frm`, which points to whichever form refreshed last.
- refactor Release v15 chore: release v15
- refactor Release v16 chore: release v16
- refactor Set valid default warehouse in MRP item group defaults test: set valid default warehouse in MRP item group defaults
- refactor Migrate raw SQL queries in gross profit report to query builder Migrates remaining raw SQL in Gross Profit report controller to ORM query builder for no functional change.
- fix Allocate leaves left in annual quota instead of skipping allocation Earned leave rounding inflated monthly allocations beyond the annual policy, causing scheduler failures.
- fix Count a half day holiday as half a working day Half-day holidays deducted as full days from payroll, inflating per-day rates and skewing pro rata pay.
- fix Use frappe.log_error instead of frappe.error_log Company creation failed silently when a salary component insert failed due to invalid frappe.error_log call.
- refactor Release v15 chore: release v15
- refactor Release v16 chore: release v16
- feat Open CRM Lead and CRM Deal on Activity CRM Lead and CRM Deal now open on Activity first; desk v2 finds record scripts at `/doctype//frontend/record.js`.
- feat Add "Capture leads with a form" step A new onboarding step nudges users to build a web form, raising feature visibility.
- fix Add error handling and Lost Reason prompt to Kanban drag-and-drop Failed drag-drop saved silently, leaving card in wrong position without user notification.
- fix Preserve unsaved filter change on saved-view re-entry Returning to a saved view reset unsaved filter changes; now keeps the change until the view is saved.
- fix Guard primary contact before reading its mobile number Calling a deal with no primary contact threw TypeError instead of showing the "No Primary Contact Set" toast.
See all 15 changes
- fix Reply from the user's own email account Replying to an email set From to the sender; now uses the user's own email account if it appears on the email.
- fix Play call recordings stored as site files Call Details player used a recording proxy that only fetches http(s) links, rejecting file paths; now loads file paths directly.
- fix Prevent quick filter select dropdown from clipping options Quick filter select dropdown options were clipped by a parent overflow.
- fix Quick filter input reset Self-triggered view reload made the quick filter input reset stale; now counts pending reloads and skips the reload.
- fix Add auto-create for Link fields in SidePanelLayout Link fields in the side panel lacked auto-create; now opens CreateDocumentModal and writes the new doc back.
- fix Complete web link attachment upload and surface its errors Web link attachment upload left the dialog open, failed silently, and never reset loading state.
- fix Add tooltip to side panel edit layout button Edit layout pencil in the side panel had no tooltip while others showed "Edit Fields Layout".
- fix Keep server metadata out of automation undo snapshots fix: keep server metadata out of automation undo snapshots
- refactor Add sample replacement pages for CRM Organization and Note Sample replacement pages show how DocTypes declare their own record/list pages.
- refactor Minor Release v1.85.0 chore: Minor Release v1.85.0
- fix Remove appointment booking icon from sidebar fix: remove appointment booking icon from sidebar
- fix Lowercase 'content' in course content empty state fix: lowercase 'content' in course content empty state
- fix Perms on assignment fix: perms on assignment
- fix Narrow write on a program to the people named on it fix(perms): narrow write on a program to the people named on it
- fix Fix!: show data to intended users Restricts access to private lesson files, sanitizes saved rich-text content, and restricts evaluation access so evaluators only work with assignments they are actually assigned to.
See all 9 changes
- refactor Upgrade frappe-ui to 1.0.0-rc.1 LMS moved from frappe-ui `1.0.0-beta.69` to `1.0.0-rc.1`; Settings code fields and Inputs refactored.
- refactor Add version-17-hotfix and all-hotfixes backport rules chore: add version-17-hotfix and all-hotfixes backport rules
- refactor Require the frappe release that ships ConditionBuilder chore: require the frappe release that ships ConditionBuilder
- refactor Declare the v17 line's python and node floors chore: declare the v17 line's python and node floors
b
Builder
7 new features · 1 speed-ups · 11 fixes
- feat Show the open folder's pages above the layers tree Builder now shows pages from the current folder at the top of Layers, one-click switching between related pages.
- feat Keep canvas zoom and pan when switching pages Switching pages in editor keeps zoom and pan; opening a page still fits it; shorter page scrolls to top at same zoom.
- feat Label the components panel Components tab now opens with **Components** heading like other panel sections.
- feat Show page status as a dot in the meta line Replaces prominent Live badge with small status dot in meta line; shows live (green), staging (violet), or draft (grey) with hollow dot for unpublished changes.
- feat Make the draft status dot hollow Makes draft status dot hollow to match the "filled means live, hollow means not live" rule across all page statuses.
See all 19 changes
- fix Set the route variable example in monospace Route hint `/users/:id` now renders as code.
- fix Tighter social preview card in page meta settings Social preview card stretched to form height; now sizes to content with proper link preview layout.
- feat Add gap handlers for flex and grid containers Flex and grid containers now have draggable on-canvas gap handles, like padding already did.
- feat Reload preview when the page is saved elsewhere Builder preview reloads when saved in another tab.
- perf Warm the editor demo up on arrival, not on hover The editor demo on frappe.io/builder now boots on arrival instead of on hover, improving perceived load time.
- fix Restore the develop frontend build Build was broken due to duplicate identifier and changed js-yaml default export.
- fix Hide the pages list scrollbar and skip redundant list loads Pages list scrollbar appeared unnecessarily; page switch triggered duplicate list loads.
- fix Create duplicate pages as numbered drafts and add rename to page actions Duplicating a page kept the original title; copies inherited publish state.
- fix Normalize nested block selections Multi-selection could contain a block and a nested block; copy and paste then duplicated the nested; now keeps only outermost blocks.
- fix Keep the editor demo from capturing the page's edit link The Builder demo no longer hijacks the edit link by clearing its `window.name` assignments.
- fix Stop dark-mode image sources adding an extra layout gap Dark-mode images no longer add an extra gap by hiding `<source>` elements properly.
- fix Load real italic faces in the editor and at inherited weights Italic text now loads real italic faces at inherited weights instead of browser-slanted romans.
- fix Restore dashboard sidebar header menu The Builder dropdown in the sidebar now shows options after the frappe-ui 1.0.0-beta.76 upgrade.
- fix Let the editor demo open when the canvas is ready first The editor demo now opens reliably when the canvas is ready before the page finishes loading.
- fix Correct SLA deadline timezone and hold-time deduction SLA badges showed wrong deadlines across timezones; agents saw deadlines 2.5 hours early on some sites.
- fix Open the welcome ticket after skipping the questionnaire Skipping onboarding landed admins on Home instead of the seeded welcome ticket.
- fix Show a field value the fetched options do not carry Option fields fetched from an API showed "Set Site Name..." while holding a value the agent never saw and could overwrite.
- fix Save a link field once when the value is cleared then picked Defers field clear so a link field picker that lands immediately after cancels the clear, preventing duplicate saves and timeline entries.
- fix Add optimistic reply and comment in the timeline Wires composer emit, sends comments optimistically through the timeline, and ensures socket-less replies still appear without refresh.
- feat Make the filter picker's key hints clickable Filter picker's Back, Select and Apply hints now clickable ghost buttons; dashboard filter clear icon sized.
- feat List workbooks and dashboards by access, with quick filters Lists now show owned and shared workbooks and dashboards with quick filters by title, data source, and other fields.
- feat Review a large change by question, in stages Splits large code reviews into multi-stage runs: plan step, per-question readers up to ~25 files, merge step to apply findings.
- fix A division by zero returns null on PostgreSQL PostgreSQL aborted division queries while MariaDB returned NULL; queries behaved differently across databases.
- fix Show the exception message when the traceback ends with SQL context DuckDB errors now show the message from the last traceback line instead of just the bare exception name.
See all 11 changes
- fix Map and number card regressions from the frappe-ui upgrade Maps without data and Number cards now render correctly after frappe-ui chart token and type-scale changes.
- fix Corrections from the first site scans Fixes site scan metrics: reads installation age from oldest Patch Log, adds DuckDB catalog reader, excludes unknown charts from totals.
- refactor Move frappe-ui to main chore(deps): move frappe-ui to main
- refactor Warn when another app declares insights_workbooks Prints deprecation warning at migrate if another app declares the retired `insights_workbooks` hook before moving to next major version.
- refactor Run semgrep in one batch Enforces semgrep serial mode to prevent parallel batch scans from interleaving checkout state and producing inconsistent findings.
- refactor Test develop on Frappe develop, and version-3 pull requests on v15 and v16 Tests develop branch on Frappe develop, and version-3 pull requests on Frappe v15 and v16 to catch breaks before release.
p
Press
3 new features · 14 fixes · 2 refactors
- fix Hide the plan change notice when the plan never changed Change-plan dialog showed "Plan last changed on..." for sites that never changed their plan; now hides the line for Initial Plan entries with no from_plan.
- feat Auto expire after 7 days Auto expire after 7 days
- feat Exempt teams from 7 day wait for SSH access if they have a subscription or have paid an invoice Teams with subscriptions or paid invoices bypass SSH access wait period.
- feat Add process snapshot script `press/scripts/ps_snapshot.sh` saves a timestamped snapshot of all processes with user, PID, CPU, memory, state and command line.
- fix Date the initial plan change of a standby site at signup Plan History dated the Initial Plan row to site.creation, so a standby site claimed after days in the pool showed the pooling date, not signup.
See all 19 changes
- fix Wait until the site answers before login redirect After signup, the proxy sometimes redirected to the dashboard before its upstream was loaded; now waits until the site answers a request.
- fix Try connecting to agent a couple of times when trying to poll jobs Server resize retries agent connection on transient failures.
- fix Open the full plan list on unified Hetzner servers CPU and Memory only resize checkbox started checked, hiding full plan list; now starts unchecked.
- fix Show replica charts, add slow queries by query Database replica analytics now show charts and the Slow Queries card displays breakdowns by query name.
- fix Cycle chart colours when series outnumber them The Disk I/O chart no longer crashes on hover when series outnumber theme colours.
- fix Skip Bahrain and UAE in orphan cleanup Unreachable Bahrain and UAE clusters are now excluded from orphan snapshot deletion.
- fix Skip in-use snapshots in orphan cleanup Orphan snapshot cleanup now correctly skips snapshots linked to live Server Snapshots.
- fix Wait for proxy upstream before marking site created Standby trials no longer get marked "Site Created" before the proxy's upstream job finishes, preventing early `site_not_found` redirects.
- fix Skip trial requests without a site in subscription job The subscription job now skips trial requests with no site, preventing `AttributeError` on missing `creation`.
- fix Allow bool in the stored value type selects Press Workflow tasks that return booleans no longer fail on save.
- fix Don't restart benches when Increase Disk Size resizes nothing Disk resize jobs no longer restart benches when no resize actually happens, preventing unnecessary container recreation during prolonged disk-full alerts.
- fix Hide the take backup button on archived sites fix(dashboard): Hide the take backup button on archived sites
- refactor Embed product trial logo inline in trial emails Embed product trial logo inline in trial emails
- refactor Title formatting in AlertBanner component Title formatting in AlertBanner component
o
Other
2 breaking · 43 new features · 7 speed-ups · 64 fixes · 8 refactors
- breaking Keep image caption styled when soft breaks render as <br> Image captions lost their italic style because soft breaks between image and caption rendered as `<br>`, breaking the CSS selector.
- breaking Feat(Sidebar)!: settle five sidebar family behaviours before 1.0 Settles SidebarItem icon behavior, attribute split, nav landmark, and other family-wide inconsistencies with breaking changes before 1.0 release.
- feat Type Admin dashboard codebase Type Admin dashboard codebase
- feat Advance slides on their own and present on loop Slideshows can now auto-advance after a delay per slide for unattended booth displays.
- feat Bound guest metadata to a 256 KiB MMDS cap VM metadata now validated against Firecracker's 256 KiB MMDS limit to prevent guest hangs.
See all 124 changes
- feat Pass the Datum host config to Cargo Cargo now accepts Datum Host config during provisioning via the dialog.
- feat Pass the datum credential to a new pilot New Pilot servers receive Datum endpoint and token in bootstrap metadata for telemetry.
- feat Build host binaries and images in Docker on macOS macOS developers can now build Atlas binaries and Ubuntu images in Docker without Linux headers.
- feat Add Visit site and Open server to site server actions Site server actions menu now shows both "Visit site" and "Open server".
- feat Apply the datum credential from bootstrap metadata Pilot parses and applies Datum telemetry config from bootstrap metadata.
- feat Register a region's Cargo automatically once it answers Central automatically registers Cargo after it answers health checks; no manual URL entry needed.
- feat Redesign Addons/Object storage page Redesign Addons/Object storage page
- feat Add static pool dialog for Generic provider Generic provider operators can now add static IP pools from a short dialog.
- feat Search events from the command palette Calendar search now finds events from shared calendars and shows results on a phone search page; searches and ranks improved.
- feat Public ipv6, firewall, and web console Servers can request public IPv6 address and Atlas firewall; web console opened from dashboard; server overview shows public addresses and SSH command.
- feat Enforce server-scoped role grants Role granted on one server now applies only to that server; team-wide grants and server-scoped grants both supported.
- feat Ubuntu and ssh flow Team SSH key management and per-server key selection for Ubuntu VMs; public IPv4 with SSH-only inbound access; clear connection instructions.
- feat Add dashboard facing APIs for Object storage Bucket management routes for the dashboard: list, create, rotate, cap and delete buckets with tenant/region prefix.
- feat Pilot image with apps Pilot images can now have apps baked in.
- feat Add IPv6 routers, public IP pools, and VM routes VMs can get public IPv6 through an IPv6 router or direct `/128`; Public IP Pool replaces Metal Server IP Address; one route list replaces egress mode.
- feat Route automatic IPv6 on AWS and Scaleway Atlas setup now enables Route Automatic IPv6 for AWS and Scaleway.
- feat Don't clone full repo for pinned full sha Pinned full SHA no longer clones the full repo.
- feat Rewrite for the 1.0 release README rewritten to show current shape of package, skipping 2022 origin story and adding everything 1.0 brings.
- feat Run transform once, and keep each user's cache apart Cached list with transform no longer crashes on second open; each signed-in user gets their own cache with no setup.
- feat App-shell layout, one structure for component pages, rewritten migration guide and changelog Docs site now has app-like layout, one page structure for every component, plain-English migration guide and changelog fact-checked against originals.
- feat KeyboardShortcut draws + only between text keys; LoadingIndicator is now Spinner KeyboardShortcut writes shortcuts naturally ("⌘K" not "⌘+K"), LoadingIndicator made same component as Spinner; auto plus rule for cross-platform readability.
- feat Add create-frappe-ui, to start a frappe-ui app in one command `npm create frappe-ui@latest` now starts a frappe-ui app with one command, automating the dozen manual setup steps.
- feat Delete a space from space settings Spaces can now be deleted from Space Settings, with a confirmation dialog listing what will be deleted.
- feat Take, bill, keep and restore VM snapshots Customers can take, keep, delete and restore server snapshots; Central owns each snapshot's record, price and deletion.
- feat Give app publishers read access to their events App publishers now get read-only database access to the Pulse Event view, filtered to their apps.
- feat Create Loan Repayment from Bank Reconciliation Tool Loan Repayments can now be created directly from the Bank Reconciliation Tool, the same way Payment Entries and Journal Entries are.
- feat Add RBI Key Facts Statement (KFS) The loan flow now includes a Key Facts Statement as required by the RBI, showing amount, interest rate, tenure, instalment and repayment schedule.
- feat Show missing fields and allow removing them The data source editor now detects and displays fields configured but missing from the schema, so they can be removed.
- feat Bucket via doctype model Adds a Bucket doctype and removes the custom arbiter model in favor of garage arbiter.
- feat Use NDP discovery and add support for VM gateways WG Mesh now uses NDP for discovery, supports tenant-0 VMs as network gateways, and public IPv6 blocks without per-VM public addresses.
- feat Add frappe_microsoft365 Microsoft 365 integration for Frappe and ERPNext with two-way Outlook calendar sync, Teams meeting creation, and sign-in with Microsoft.
- feat Add buzz to the registry Buzz, an open-source event management app, is now in the app registry.
- feat Grow disk on resize and adopt the unified Atlas resize API feat(servers): grow disk on resize and adopt the unified Atlas resize API
- feat Page view analytics Adds Web Page View logging for published wiki pages, Overview page with views, visitors, and top content metrics, and per-space/per-page analytics in settings.
- feat A DMARC Reports page in the Mail Admin Dashboard Displays DMARC aggregate reports with pass-rate tiles, sending sources, reporters, and per-source verification records grouped by domain and period.
- feat DMARC reports are copied from the clusters and served to sites Copies DMARC aggregate reports from cluster receivers hourly into `DMARC Report` documents and retains them per site settings.
- feat Delete identities from settings Adds Delete button in Mail Settings > Identity with confirmation, using server-reported deletability and bulk_delete backend.
- feat Feat(typography)!: text-* line height is 1.35, leading-tighter keeps 1.15 Changes default text line height from 1.15 to 1.35 for better readability on wrapped text, adds leading-tighter class for single-line text.
- feat Move the user switcher into the account menu and the You page Removes floating dev user switcher and integrates it into the account menu on desktop and Developer group on the You page mobile.
- feat Manual override for build memory cap via bench.toml Adds `[build] memory_limit_mb` setting in bench.toml to override auto-sized build memory cap.
- perf Load the VM form with one Metal read VM form loads 37 ms faster; Metal client certificate now cached for an hour instead of rechecked per request.
- perf Store Ubuntu root file systems as zstd Ubuntu 4 GiB images compress to 303 MiB zstd, reducing downloads and storage.
- perf Copy uncompressed image downloads in 1 MiB writes Image copy now runs at network speed instead of 3.3 MiB/s; 43 MiB/s on staging.
- perf Simplify the VM and Cargo Server forms VM and Cargo Server dialogs reorganized into cleaner sections with fewer descriptions.
- perf Remove uncached host images one hour after last use Uncached images now evicted after 1 hour instead of 24, freeing host storage faster.
- perf Simplify server provisioning actions ResourceAction refactored for clarity; each rule now has one owner. Fixes two resize problems.
- perf Fix(editor)!: rename UploadedFile to UploadedMedia so upload() fits uploadFunction Renames `UploadedFile` to `UploadedMedia` in frappe-ui/editor so the root `upload()` function can be passed to editor's `uploadFunction`.
- fix Boot Ubuntu 22.04 images with the 24.04 kernel Ubuntu 22.04 guests failed to boot with kernel panic on missing root device.
- fix Settle public IP intents for VMs that Metal does not hold Stale draft VMs created 49,000 error logs by failing IP updates every minute.
- fix Wake a sleeping VM on start Start request did nothing for sleeping VMs; only new traffic woke them.
- fix Reclaim retired image artifacts after six hours Replacing System images left old artifacts in storage indefinitely.
- fix Sweep only images with a site file retention time Expired site file sweep saved every Object Storage image every 15 minutes, polluting audit logs.
- fix Prepare host storage and retire unused warm images Metal setup could write state before ZFS dataset mounted; warm image retirement didn't account for in-use disks.
- fix Pass the document to controller method calls Eight desk buttons failed with "Failed to get method" (Test Connection, Enroll Atlas, etc.) because `frm.call` didn't specify the document.
- fix Read storage and telemetry from their own instance metadata attributes Pilot read storage from bloated pilot-central, exceeding cloud's 1 KiB metadata limit.
- fix Read the dispatch time in the system time zone Server creation marked as "not created" due to timezone mismatch in recovery search.
- fix Send Pilot storage and telemetry as their own guest metadata values Every Pilot server create failed when metal-central metadata exceeded 1024-byte limit.
- fix Use frappe-ui ScrollArea for native scrollbars in dark mode Dark mode showed light browser scrollbars on emoji picker and dialogs.
- fix A cell fill keeps the grid lines around it Cells with background colour erased top and left grid lines.
- fix List disabled authors in the author filter Search author filter listed only enabled users, blocking filters by posts of disabled accounts.
- fix Bound the NDP payload length for the verifier Kernel BPF verifier rejected WG Mesh uplink program.
- fix Fit small diagrams on desktop Small flow diagrams scrolled horizontally despite fitting in the reading column.
- fix Datum setup fixes Datum setup fixes
- fix Permission-check logs, sends without a reference, and account sync endpoints Whitelisted endpoints for logs, sends and syncs required no permission check, so any logged-in user could read business logs, send from the business number, or trigger a sync; now each requires matching DocType permission.
- fix Screen ham with a positive spam score Stalwart v0.16.19+ hands Sieve a graded spamtest value instead of 1 or 10; mail with a small positive score (≥0.1) skipped screening and was delivered to the Inbox.
- fix Drop foreign sources without a gateway return route IPv6 router translated every public address in its block to mesh; WG Mesh now delivers foreign-source packets only when the VM has a gateway route back.
- fix Open a page again after returning to the pages list Opening a page again after returning to the Pages tab showed the URL change but the Pages list stayed on screen; Teleport target was missing.
- fix Update discussion title optimistically Renaming a discussion showed the new title only after the server answered; now shows it at once.
- fix The attachment viewer keeps clear of the iOS safe areas Attachment viewer teleported to body had no safe-area insets, so buttons went under the status bar and home indicator.
- fix Show the caret when clicking below the compose body Clicking below the compose body gave focus with no caret because an empty non-editable node at the end became the default block.
- fix A collapsed row keeps its height when the cursor arrives Collapsed mail rows rose ~2px under the cursor when the preview was empty; now states the same 20px height on the name.
- fix Keep custom app builds working with the v1 code field App builder build failed with codemirror/lezer conflicts; skips pages with no blocks.
- fix Warm-start only a new VM disk Warm image memory is valid only with the image disk it was captured with; now resumes only on first boot.
- fix Remount the guest root read-only on errors Guest with ext4 errors kept writing to damaged disk; base images now set ext4 error behavior to remount-ro.
- fix Harden the tenant networking API Network changes on one VM run serially; API returns clear conflict messages; IPv6-only VMs can now resolve names.
- fix Fix IPv6 router setup, catalog sync, and node console Router creation, Scaleway catalog sync and node console access restored.
- fix Serve the VM console page to every user Console link returned 403 for users without a Frappe session; now serves `/vm_console` to every user, token validates access.
- fix Refuse a non-empty bucket delete as invalid input Non-empty bucket delete now shows "Bucket still holds objects" instead of "Could not confirm".
- fix Pilot image fixes Pilot image improvements.
- fix Pilot image utilities Pilot image utilities and machine doc updates.
- fix Remove silently introduced dependency Removed unintended dependency.
- fix Validator use bench python environment for app syntax validation App validation now uses bench's Python environment instead of Pilot's, so modern syntax on newer Python versions passes.
- fix Skip evaluating `_strip_eval` on empty expression for `_or_whatsapp` and `_and_not_whatsapp` Installation evaluation on empty expressions threw.
- fix Billing sidebar and snapshot Billing sidebar collapse, badge display and snapshot UI fixes.
- fix Rename side to edge with start/end values Tabs `side` renamed to `edge` with start/end values matching text direction; line and selected tab styling updated.
- fix Make the visibility toggle a focusable button The Password component's eye toggle is now a proper button, keyboard-focusable with a tooltip showing the `Mod+I` shortcut.
- fix Remove issue triage Barista's issue triage workflow is removed; fix and review modes stay, now reading the issue directly instead of triage comments.
- fix Enter opens the selected cell for editing Pressing Enter on a selected cell now opens it for editing instead of moving the selection down.
- fix A lone draft fills the reading pane, and reply drafts stop hovering grey A draft opened from Drafts now stretches to the pane, and reply drafts under other mail no longer pick up hover styling.
- fix A filled cell takes its ink from the fill, not the theme Color-scale rules in dark mode now use the cell's effective fill for text color, making values readable.
- fix Collapse quote trails from every client, and keep quotes intact through the composer Mail now collapses quoted content from Gmail, Suite, Yahoo, Proton, Zoho, Outlook Web, and Apple Mail/Thunderbird, and preserves quotes through the composer.
- fix Search mail from the command palette Mail search moves from a separate modal into the command palette behind a filters button, unifying mail search with the rest of the app.
- fix Capture review comment ID reliably Barista review comment tracking is now reliable by reading marker files instead of trusting state.
- fix Measure a message body with a box, not without one Message bodies now measure with a visible box, fixing cases where the iframe resizer reported 1px height on empty bodies.
- fix Print format fixed Printing a discussion now produces a usable document without sidebar and with all comments visible.
- fix Fix search focus Search now accepts Enter and Backspace without being manually focused.
- fix Join active line highlight to gutter The active-line highlight now extends to the line-number gutter while text keeps its inset.
- fix Fix/unicommerce old order returns sync Old Unicommerce orders now get RTO credit notes by fetching the facility code from each package's Sales Invoice.
- fix Mobile settings Settings on phones now display without squeezing, using the More menu for tabs and full-width panels.
- fix Recompute sticky column offsets on column resize Pinned columns stay aligned after resize drag and double-click auto-fit.
- fix Tidy the server overview snapshots card fix: tidy the server overview snapshots card
- fix Pin the sidebar collapse knob at the middle of its edge fix(ui): pin the sidebar collapse knob at the middle of its edge
- fix Remove routes on terminate and close resize gaps fix(servers): remove routes on terminate and close resize gaps
- fix Create bench env before get-app validation fix(validation): Create bench env before get-app validation
- fix Scope the task list to spaces the user can see Restricts task list queries to only spaces the user can access, preventing users from reading tasks in private spaces.
- fix Check community access on space move, guests cannot manage or move Enforces community access check when moving a space and revokes guest ability to manage or move spaces.
- fix Resize body cells while dragging a column Applies column width updates and body style changes on every mouse move during resize, preventing header-column misalignment during drag.
- fix Hide the bottom nav on discussion and editor pages, float the comment button Hides mobile bottom nav on discussion and editor routes, floats the comment button with proper clearance above the nav in PWAs.
- fix Use wiki logo as /wiki-app favicon Replaces Frappe favicon with Wiki logo and removes stray favicon from highlight build output.
- fix Bullet and numbered list fixes Fixes bullet and number markers drifting from text on mixed font sizes, running into numbers in aligned lists, and improper spacing.
- fix Add Overview tab to the bottom nav Adds Overview tab to mobile bottom nav for Wiki Managers and keeps Change Requests active on the review route.
- refactor V1.0.0-rc.2 Chore(release): v1.0.0-rc.2
- refactor Minor UI fixes Minor UI fixes
- refactor Rebuild developer onboarding Atlas handbook reorganized into one onboarding path with simplified homepage, improved diagrams, and component READMEs.
- refactor Add more tabs & full clean up! frappe-ui updated, full TypeScript codebase, Vite HMR working, dialog improved, more sections added.
- refactor Simplify v0.2 control plane Server operations now have one durable state owner, customers get actionable errors, and Desk operators can trace failures from Resource Actions.
- refactor Parse mail and calendar input with pydantic Mail and calendar shape validation now use Pydantic models instead of hand-written checks, with named field errors on validation failure.
- refactor Sync translations from crowdin chore: sync translations from crowdin
- refactor Data source editing & fetching test: data source editing & fetching