Weekly report
Frappe and ERPNext changes, 28 Sep to 4 Oct 2026
415 changes merged: 1 breaking, 87 new features, 29 speed-ups, 240 fixes, 58 refactors.
Breaking changes
Read these before you update. They can change how your site or app works.
Highlights
- feat Show the desk architecture at /desk-architecture in developer mode Developers can now visualize desk v2 architecture at `/desk-architecture` with layer diagrams and import graphs.
- feat Onboarding on workspaces, calmer cards, chart empty states Onboarding displays as a block on workspaces, steps tick off only when complete, and optional steps don't hold up completion.
- feat Server-side jinja rendering for report printing Report print formats can now be written in Jinja instead of the browser-side JS engine, with access to any server data.
- feat Add label_position option to Stepper Stepper component now supports label positioning at "right", "left", "top", or "bottom".
- feat Improved setup wizard Setup wizard is redesigned, apps can show custom help text, and analytics track per-step progress.
See all 103 changes
- feat New kanban board Configurable Kanban board for any DocType, opt-in via a Kanban Board setting. Card fields, display format (icon/text), and grouping are customizable per board.
- feat The record page restores its view on a return visit Record pages restore their tabs, scroll positions, and Details form tab on return visits, both within and across app navigation.
- feat Default list layouts shipped by app Apps can ship default list layouts for their doctypes, visible only in Developer Mode.
- feat Page.cached, server data a Client Script reads without a second paint Client Scripts can export `onRefresh(page)` to read and cache server data without a second repaint on return visits.
- feat The currency lookup reads linked currencies from the shared data cache Currency fields reading from linked records now use the shared data cache, so changed linked currencies show on next visit and on record save.
- feat OnOpen, a Client Script handler that runs once per visit Client Script `onOpen(page)` handler runs once per visit after first replay, not on replays, for setup-only logic.
- feat The feed store lives as long as the record's cache entry Activity feed stores now live exactly as long as the record's cache entry, preventing orphaned stores and keeping memory usage predictable.
- feat Paint a returning list from the shared cache Return visits to lists and saved views now paint from the shared cache with no skeleton, reading again quietly in the background.
- feat Pin the dock by default Dock now starts pinned beside the sidebar instead of floating. Existing users keep their setting.
- feat Much better looking email composer Redesigned email composer with improved UI.
- feat A return visit after a script or DocType change paints the old version, then the new Return visits after Client Script or DocType changes now paint the old version from cache, then refresh with new schema on the background read.
- feat Dock preference End users can now choose whether the dock is floating or pinned.
- feat Redesign the editor with Form Builder and field picker Web Form editor is now redesigned with Form Builder sections and a field picker, replacing the flat grid.
- feat Data import wizard: Config → Preview → Fix → Import Data import form is now a 4-step wizard showing clear progress; each step does one thing, and the Import step shows live activity counts.
- perf Remove Postgres Query Stats and Index Suggestions reports Postgres-only reports removed before they became stale; pg_stat_statements bootstrap and permission filter also removed.
- perf Refactor!: remove Whoosh-backed website search Whoosh website search has been removed; SQLite and global search remain.
- perf Check layers, folder loops and concepts on each PR Desk v2 guardrails CI checks now verify layers, folder loops and concepts.
- perf Run only the test modules the impact map selects CI now runs only test modules affected by changes, reducing expected test time by ~49%.
- perf Check JS bytes and API calls per desk page against baselines CI now checks JS bytes and API calls per desk page against performance budgets.
- perf Keep test_enqueue_jobs off the live worker Scheduler tests no longer push jobs to the live worker queue, preventing concurrent test failures.
- perf Run every test file under frontend/ and ui/ CI now runs 85 test files that were previously skipped; two patterns replace twelve folder-by-folder entries.
- perf Write the desk v2 architecture ARCHITECTURE.md documents the nine layers of desk v2, allowed concepts per layer, main flows and known deviations.
- fix Don't print object attributes in tracebacks Prevent database passwords and other sensitive object attributes from leaking into error tracebacks by disabling object details in traceback-with-variables.
- fix Don't load virtual single doc for doctype permission check Stop instantiating virtual doctypes during permission checks to prevent recursion that enqueues background jobs and crashes the queue when overloaded.
- fix Restrict get_email_html preview to System Manager Require System Manager permission for the email preview endpoint to close an admin-only API exposure.
- fix Ignore lft, rgt and old_parent sent by the client Tree structures now reject stale client values that could corrupt nested set bounds when a tree changes during an edit.
- fix Keep generated columns out of deleted-field cleanup Schema sync no longer drops database-generated columns, which were incorrectly treated as deleted user fields.
- fix Correct currency minor units and Angola's currency code Fix currency configuration so zero-decimal currencies (JPY, KRW, etc.) and JOD format correctly in `money_in_words()`.
- fix Stop caching data-dependent dynamic links The Links dialog now finds newly-created dynamic links instead of hiding them until the doctype cache is cleared.
- fix Bump PyPika to fix arithmetic with Table and subquery operands Restore arithmetic operations on Table and subquery objects, which crashed with "Field object is not callable" in ERPNext queries like `has_potentially_billable_items`.
- fix Preserve literal values in list view filters Clicking a list cell with `User` or `Today` no longer resolves to the logged-in user or current date; only indicator filters resolve these special values.
- fix Emailed prints ignore the chosen print language Email queue prints now respect the selected print language instead of resetting to the sender's language mid-print.
- fix Prints attached in a background job ignore the user's language Attached prints from background jobs now use the job user's language consistently instead of falling back to stale English.
- fix Group by sums show foreign amounts in company currency Grouped sums now show without a currency symbol when they mix multiple currencies, preserving symbols only for single-currency groups.
- fix Add accessible names to unlabelled controls and images Screen readers now announce alt text for images, aria-labels for buttons and inputs, and proper tab order.
- fix Avoid unavailable is_empty in v15 multiselect V15 multiselect validation now uses a compatible check instead of the unavailable `is_empty` utility.
- fix Store currency number format without sql escaping Currency number formats no longer store SQL escape characters, so formatting works correctly across databases.
- fix Resolve a declared package in an app file through vite App files can now import packages declared in `desk.package.json` through Vite resolution.
- fix Link to an unreadable doctype reports an error about page Opening a desk link to an unreadable doctype now shows a permission error for the doctype, not a confusing error about Page.
- fix Solve issue in checking js in pdf The utility function for detecting JavaScript in PDFs now works correctly.
- fix Close the four medium security gaps in desk v2 Fixed four medium-severity issues in desk v2: email frame innerHTML injection, unsafe field access from chat frames, unsafe sidebar actions, and unvalidated user code.
- fix Check write perm. on attachment File attachment deletion did not verify write permission on the attachment.
- fix Show separators in non-Mac menu shortcuts Espresso menu migration removed separators from keyboard shortcuts, showing `CtrlE` instead of `Ctrl+E` on Linux and Windows. Restored with regression test.
- fix A kept feed store no longer keeps the page that built it Activity feed store kept entire record pages in memory even after navigation. Idle stores now release when the record's cache entry leaves.
- fix Keep tab remove button inside the tab strip Form Builder's tab remove button overflowed the tab on hover, causing unwanted scrollbars. Now positioned inside.
- fix Form shows stale defaults and saves them back System Settings form showed database defaults instead of saved values on load, then saved them back, reverting manual changes like timezone corrections.
- fix Keep a site's own board on sync and allow a DocType's hidden title Sync replaced a site's own Kanban Board with a shipped one of the same name. Now skips if a non-standard board exists.
- fix Header size for sidebar header Lucide icons in the sidebar header looked incorrect. Replaced with better-sized icons.
- fix Postgres fixes (multiple) Scope site role access to its own database, fix column type changes, persist manual indexes, fix query builder and Engine issues, keep index names in sync, and let managed root drop databases.
- fix Minor UI fixes Empty states in global search, Espresso buttons in layout manager, single connection toast, avatar fallback in email composer, truncated badge labels, docs links in dropdown menus.
- fix Navbar menu button shows no icon on mobile Website navbar menu button showed an empty box on mobile. Lucide icons need stroke; old CSS rules hid it.
- fix Validate private file access before inserting Validates access to private files before insertion, preventing unauthorized file handling.
- fix Apply field permissions to query aliases and goal aggregates Field permissions now apply to query aliases and aggregate functions, closing permission bypass paths.
- fix Validate output path before compiling theme css Validates output paths before compilation to prevent path traversal during theme CSS compilation.
- fix Prevent currency symbols overlapping grid amounts Currency symbol overlap in editable table rows is now prevented by sizing padding from the rendered width.
- fix Web forms ignore link filters on link fields Web forms now respect link field filters instead of showing the full list.
- fix Prevent crash when focusing child table fields on touch Removed the broken touch-only grid shift that crashed on focus.
- fix Keep list view columns in place after a refresh List view columns no longer shift right after reload by aligning header and row widths.
- fix Saving settings fails on a board with no card fields Kanban settings can now be saved when no card fields are configured.
- fix Align list view toolbar on mobile Mobile list toolbar ID box and quick filter columns are now properly aligned.
- fix Keep button hover off touch screens Buttons no longer stay grey after tapping by using `@media (hover: hover)` for hover styles.
- fix Pick the PDF engine for the doctype's default format Print, attach_print and multi-document PDF download now use the correct PDF engine for the default format instead of always using the standard one.
- fix Contact search link filter, select permission and ranking Contact search now filters links through Dynamic Link subqueries, respects select permissions, and ranks case-insensitively.
- fix Skip SMTP login when authentication is disabled SMTP login is now skipped when disabled, including for OAuth and basic accounts with saved passwords.
- fix Missing file under /files returns 500 instead of 404 Missing files under `/files/` now return 404 instead of 500.
- fix Skip virtual fields when saving singles Single doctypes no longer store virtual fields in `tabSingles`.
- fix Format sidebar template with $.format instead of __() Global search sidebar template is now formatted correctly instead of trying to translate it.
- fix Show Link titles for child table columns in Report Builder Report Builder now shows Link titles for child table columns.
- fix Check the DocType name length when syncing its table DocType name length is now checked when syncing tables, preventing Postgres truncation on import.
- fix Cut long Postgres index names by bytes Postgres index names are now truncated at 52 bytes instead of characters, preventing non-ASCII collisions.
- fix Pdf is blank when the letterhead leaves a tag open PDFs with unclosed letterhead tags are no longer blank by balancing tags before rendering.
- fix Compare is set filters with the column's empty value `is set` / `is not set` filters now compare with each column type's correct empty value instead of an empty string.
- fix Parenthesize subqueries in rendered permission conditions Permission criterion subqueries are now properly parenthesized, fixing Company Restriction queries on all databases.
- fix Postgres CI failures in session hash and backup tests Two flaky Postgres tests fixed: session hash lookup and backup timestamp ties.
- fix Stop exposing `_comments` through list queries Comment preview cache is no longer returned in list reads; only Comment-permitted users can see preview text.
- fix Don't expose imported functions from module-path hooks Jinja hook functions now only expose what is defined in the hook, not imported modules.
- fix Keep typed value when Time picker is shown again Time field picker no longer reverts to the previous value after a manual edit; the refresh now preserves the typed input.
- fix Multiselect pills adds an unselected option after picking one Unlabeled multiselect options now fall back to their value; picking a user no longer adds an unselected one.
- fix Support sticky columns in RTL Grid sticky columns now work correctly in right-to-left layouts.
- fix Fall back to docname when title lookup target is unreadable Link fields no longer show "Not permitted" dialog for every unreadable value; the docname is shown instead.
- fix Sync calendar year with date input Date field calendar now updates when only the year is changed in the input; picker and input stay in sync.
- fix Stop a new comment showing up twice Activity timeline pending rows are now removed correctly; comments no longer show as duplicates until a hard reload.
- fix Nested __() calls in JavaScript missing from POT file Translation extraction now finds strings nested inside other __() calls; translators now see `Email Inbox` and other inner strings.
- fix Fix login page tab title translation Login page tab title is now translated instead of staying in English.
- fix Allow ordering by expression aliases on postgres Postgres grouped queries can now order by arithmetic expression aliases; complex sorting works correctly.
- fix Ignore network errors in Frappe Cloud current_site_info Network errors fetching trial banner info now return None instead of a 500 error dialog; gunicorn workers can't hang.
- fix Restore the statement timeout after counting dashboard links Statement execution timeout is now restored after dashboard link count; later ALTER TABLE statements no longer timeout on slow CI runners.
- fix Skip reports with deleted DocType Reports on deleted doctypes no longer trigger "DocType not found" error on every desk rebuild.
- fix Open a page route in the shell that lists it Pages with sub-routes (e.g., Insights at `insights/dashboard`) now open in the correct shell instead of their own module.
- refactor Add new user rtdany10 to VOUCHED.td New vouched user added to contributor list.
- refactor Dual-tone icons for the framework modules Framework module icons in dock and sidebar replaced with dual-tone pictographs that respond to tile state.
- refactor Release v15 release v15
- refactor Bump RestrictedPython to 8.5 bump RestrictedPython to 8.5
- refactor Stable breadcrumbs Breadcrumbs are now refactored for simplicity and stability.
- refactor Release v16 Automated weekly release.
- refactor Mark automation flow as beta Automation Flow DocType now shows the Experimental badge.
- refactor The structure checks run in CI Architecture documentation updated to reflect CI structure checks.
- refactor Write the desk v2 guardrails into ARCHITECTURE.md and AGENTS.md Desk v2 guardrails rules documented in architecture files.
- feat Add Designation column in Address and Contacts report Address and Contacts report now shows Designation field.
- feat First-transaction onboardings, Setup as home, simpler sidebars Module onboardings now center on the first real transaction, Setup becomes a module on Home, and sidebars are simplified for each area.
- feat Add Designation column in Lead Details report Lead Details report now shows Designation field.
- feat Add standard Kanban boards for common doctypes Beautiful default Kanban boards for common ERPNext doctypes.
- feat Add standard list layouts for common doctypes ERPNext ships default list layouts for common doctypes, visible only in Developer Mode, with pre-configured column filters.
See all 80 changes
- feat Add consolidated summary reports to the accounts sidebar Consolidated summary reports now appear in the Accounts sidebar.
- feat Allow bulk edit on transaction child tables Older DocTypes now have bulk edit enabled on their child tables.
- feat Dual-tone module icons for the dock and sidebar headers ERPNext modules now have two-tone dock icons that animate on hover, matching the sidebar header.
- feat Party import tool integrated with data import tool Customers and Suppliers can now be imported with their Contacts and Addresses from a single file; linked records are created and set as primary.
- feat Ship the standard dashboards as Insights dashboards Accounts, Payments, Selling, Buying, Stock and Asset dashboards are now available as standard Insights workbooks.
- feat Group Purchase Order Analysis by item Purchase Order Analysis now has a **Group by Item** filter that sums qty/amount across orders; total pending is now answerable.
- feat Consolidated accounts receivable and payable reports New multi-company AR/AP reports show outstanding invoices across related companies; rows carry company context and can be grouped.
- feat Consolidated AR/AP summary reports Summary reports show one row per company per party, followed by that party's total across all selected companies.
- feat Show the latest quotation revision as latest Latest submitted revision of a quotation now shows **Latest** instead of **Open**; a hidden Is Latest Revision flag tracks it.
- perf Cache source document permission checks in rate-locked source lookups Permission checks are now cached per request, preventing timeouts when creating Purchase Invoices from large Purchase Receipts.
- perf Move doc_events hooks into their controllers Doc event hooks on Material Request, Item and pre-submit validation are now in their controllers where they belong.
- fix Allow serial no of consumed raw material on repacked item Finished goods in a Repack now accept the serial number of a consumed raw material when they represent the same physical unit (e.g., a notebook with a case).
- fix Recalculate totals when adding time log rows Timesheet totals now update automatically when rows are added or duplicated.
- fix Take POS change off one payment row per invoice POS change calculations now apply correctly when multiple payment modes exist and accounts change mid-shift.
- fix Enforce work order details permissions Work Order details endpoint returned data without checking read permission and ignored the company argument. Now enforces both.
- fix Skip pricing calculations for RFQs Changing quantity on RFQ items triggered pricing calculations for fields that don't exist on RFQ items. Now skipped for RFQs.
- fix Filter reservation warehouses by company Stock Reservation warehouse dropdown listed warehouses from other companies. Now filtered by company.
- fix Validate Journal Entry account belongs to Company on save, not just submit Journal Entry validation only checked account-company mismatch on submit, leaving mismatched drafts in place. Now validated on save.
- fix Add a tooltip explaining "Represents Company" on Supplier and Customer The Represents Company field (for inter-company transactions) had no explanation. Now has a tooltip.
- fix Set opportunity_type default via set_value for translated doctype Opportunity type default was not translated across languages on creation.
- fix Accounting dimension shows in connections tab on stock entry, asset Stock Entry and Asset forms lacked the `dimension_col_break` field, so accounting dimensions dropped to the Connections tab. Renamed their break to match other doctypes.
- fix Keep allocation selection in the unreconcile dialog Unreconcile dialog's read_only flag on allocations table disabled row selection. Cells stay read-only through child fields instead.
- fix Preload only the postgres driver in test shards Postgres shards failed because Frappe preloaded MariaDB driver by default. Now preloads only the configured driver.
- fix Repost not created for backdated entry submitted concurrently Concurrent stock transactions no longer produce incorrect running balances or missing reposting entries.
- fix Validate material requests before creating work orders Work order creation API now validates read permission and enforces Material Request type and status restrictions.
- fix Value a transfer's inward leg at what left the source Material transfers no longer leave rounding differences in Stock Adjustment by valuing inward at the actual outbound value.
- fix Guard against missing customer in Item-wise Sales Register Report no longer crashes when an invoice row's customer doesn't resolve to a Customer record.
- fix Prevent duplicate serial and batch reservations Work order and subcontracting reservations now enforce allowed qty checks and count all reservations to prevent duplicates.
- fix Prevent transfer value drift Stock value drifts are prevented by including additional cost in transfer valuations.
- fix Net work order returns off transferred materials Work order component returns now reduce the WIP balance instead of adding a second balance in the source warehouse.
- fix Skip batch qty reserved by other vouchers in manufacture entries Manufacture entries now cap transferred batch qty at unreserved amounts when stock reservation is on.
- fix Consume batches from every transfer in manufacture entries Manufacture entries now consume batches from all transfers instead of only the last one.
- fix Allow component returns only on completed or closed work orders Component returns are now server-side validated to occur only on completed or closed work orders.
- fix Enforce party specific item restrictions on save Party Specific Item rules now block saves with disallowed items instead of only filtering the search.
- fix Check duplicate items on purchase invoices without update stock Duplicate item check now runs on every Purchase Invoice instead of only when Update Stock is on.
- fix Check item access and map pending quantities Supplier lookup now checks item read permissions, and partial orders now use remaining qty instead of full qty.
- fix Surface download errors and guard no-data statement in Process Statement Of Accounts Report now handles download errors gracefully and prevents crashes when no data is returned.
- fix Planned qty zero validation in production plan Production Plan items now reject zero or negative Planned Qty values.
- fix Validate combined material request quantities Material Request validation now prevents multiple rows for the same Production Plan item from exceeding remaining qty.
- fix Value batch and serial returns at the receipt rate Subcontracting receipt returns of batch/serial items now post at the correct value.
- fix Respect serial / batch activation in stock settings and item Disabling serial/batch activation now hides dependent settings and blocks Item enabling.
- fix Copy lead comments to opportunity without permission check Validates read access on the source Lead before carrying forward comments and activities to the Opportunity.
- fix Add company permission check for `get_valuation_rate` Validates that the user can access the company before returning valuation rate.
- fix Hide records linked to company-restricted masters Item Alternative, Party Specific Item and other linked records are now hidden when they reference company-restricted Items, Customers or Suppliers.
- fix Hide company-restricted masters in reports 18 reports now apply company restrictions to Item, Customer and Supplier masters that are scoped to other companies.
- fix Scope reports to the user's permitted companies Many reports now filter results to the companies the user has access to; bins are scoped to warehouses of permitted companies.
- fix Bill purchase receipts by qty when landed cost follows invoice rate Receipt billing now tracks by qty instead of amount; receipts of 100 units billed at 25 units no longer mark as Complete.
- fix Split order-level invoices over receipts for invoice-rate landed cost Each receipt now prices its rows from the invoiced qty against its own portion, not the entire order quantity.
- fix Bill purchase orders by qty when landed cost follows invoice rate Purchase Order over-billing check now compares qty instead of amount, matching the billing behavior of receipts.
- fix Refresh landed cost on every receipt of invoiced order lines Landed cost difference now refreshes on receipts whose billed qty moves but billed amount stays put.
- fix Derive process loss from the finished good rows Process loss on Manufacture/Repack is now derived from received rows instead of a separate input; loss stays in sync with finished good qty.
- fix Preserve zero batch values in closing balances Stock Closing keeps zero batch values instead of replacing them with the entire ledger entry.
- fix Apply zero reconciliation to closing balance Stock Reconciliation that resets qty to zero is now applied in closing balances; zero is no longer treated as missing data.
- fix Ignore incomplete closings for opening balances Stock Balance and subsequent closings now skip Failed, Queued and In Progress closings and use only completed ones.
- fix Sum repeated components in Available Stock for Packing Items Product Bundle qty is now grouped by item before dividing by stock; bundles with repeated items now show correct packable quantity.
- fix Sum repeated lines in BOM Stock Analysis qty per unit BOM Stock Analysis now sums repeated item lines to produce matching Qty Per Unit and Maximum Producible Items columns.
- fix Cancel reconciliation entries when recreating stock ledgers Repost Item Valuation now cancels Stock Reconciliation entries before resubmitting; incomplete ledgers no longer fail.
- fix Split Trial Balance (Simple) rows by finance book Trial Balance now groups by finance book so each row holds one book's entries; no longer sums across books incorrectly.
- fix Judge each party account on its own in the invoice limit Payment Reconciliation prefilter now groups by account; Journal Entry with equal and opposite entries across accounts no longer disappears.
- fix Prevent duplicate total rows in trends reports Trends reports now return `skip_total_row` to prevent Frappe from adding a duplicate total row with doubled values.
- fix Render bank reconciliation vouchers after dialog opens DataTable stylesheet is now created only after the Actions dialog is attached; matching vouchers render correctly.
- fix Show correct currency for outstanding invoices in bank reconciliation Outstanding invoices now fetch the transaction currency instead of the company default.
- fix Refresh POS item stock qty on new order POS item stock quantity now refreshes when a new order is created; quantity is no longer stale from the previous order.
- fix Correct terms and typos in the AU chart of accounts Australian chart of accounts terms are corrected for accounting clarity.
- fix Avoid too many writes in main item code patch Material Request Plan Item patch now batches data loads and uses bulk_update; large migrations no longer fail with TooManyWritesError.
- fix Remove unfilled backdated message placeholder Backdated stock transaction error now shows the list of authorized users instead of an empty placeholder.
- fix Leave the batch out of the sample limit alert when there is none Sample retention alert for batched items now names only the item when the batch is missing.
- fix Read company when account filters are applied in Invoice Discounting Invoice Discounting now reads the company from the account filter instead of relying on context; filtering works correctly.
- fix Compare the invoice rate against the receipt's net amount Invoice-rate landed cost now compares against the receipt's base_net_amount (after discount, before inclusive tax) instead of the rate.
- fix Post the purchase return after timed receipts Purchase return test now posts at 12:00 after receipts; test no longer fails when CI runs before 08:00 in site timezone.
- fix Remove stale duplicates of five standard records Print Format POS Invoice, Onboarding Steps and Module Onboarding duplicates are removed; each record has one file.
- refactor Fold setup, subcontracting, regional and maintenance into other sidebars Four modules with no independent navigation are folded into sidebars that own their work; Setup masters now link from Accounts, Stock, Selling and Buying.
- refactor Release v16 release v16
- refactor Release v15 release v15
- refactor Remove support page search widget Support page search widget removed as part of Whoosh removal.
- feat Ship the standard dashboards as Insights dashboards Human Resource, Expense Claims, Payroll and Attendance dashboards are now available as standard Insights workbooks.
- perf Deprecate Daily Work Summary Daily Work Summary, Team Updates, replies report and summary emails are removed; old Communication records are retained.
- fix Guard against a blank account row when returning an advance Returning a paid employee advance left a Journal Entry with a blank required Account row when the company lacked a default cash account.
- refactor Fix icon name in Appraisal Template fix icon name in Appraisal Template
- refactor Deprecation notice for Daily Work Summary (v16) Banner, notice and deprecation warnings for Daily Work Summary ahead of removal.
- feat Use frappe-ui/charts on the dashboard Dashboard now uses the new `frappe-ui/charts` components (NumberCard, Line/Area/BarChart, DonutChart) instead of experimental charts.
- feat Show linked ERPNext quotations in a deal tab Quotations tab on Deal view lists quotations linked to the deal, with live refresh for same-site and remote ERPNext.
- feat New whatsapp integration Replaces community WhatsApp app with official Frappe WhatsApp integration on CRM.
- feat Command palette with search, navigation and actions CRM now has a Cmd/Ctrl+K command palette for searching leads/deals/contacts, navigating pages, creating records and acting on open pages.
- perf Migrate to frappe-ui 1.0.0-rc.2 CRM migrated to frappe-ui 1.0.0-rc.2 with extensive component and hook API updates.
See all 16 changes
- fix Remove the single All tab from the notifications panel Notifications panel showed a redundant All tab alongside specific notification types.
- fix Send qualified follow up only on qualification Workflow automation sent qualified follow-ups on unrelated state changes.
- fix Command palette stale search and lost lead conversion Command palette search results stayed stale on navigation, and lead-to-deal conversion was lost.
- fix Stamp target doctype in public form submission Public CRM forms now send the server-provided doctype to prevent 403 errors when overrides resolve the type from payload.
- fix Keep Data tab header and Save button sticky while scrolling Data tab header and Save button stay in view while scrolling.
- fix Translate untranslated crm user-facing messages CRM user messages are now wrapped in translation functions.
- fix Align child table header with rows Child table header borders now match row column widths.
- fix Respect make_attachment_public setting File uploads now respect the make_attachment_public setting; attachments are not forced public.
- fix Keep select dropdown below trigger on email template pages Email template Content Type and For dropdowns now stay below their triggers; list position is stable across selections.
- refactor Minor Release v1.86.0 Minor Release v1.86.0
- refactor Patch Release v1.85.1 CRM patch release 1.85.1 tagged and released.
- feat Register the assessment permission pair Quizzes, assignments and programming exercises now have list and document permission hooks, scoped through lesson embeds or batch enrollment.
- feat Redesign assessment blocks and render them inline in lessons Quizzes, assignments and programming exercises are now restyled as cards and render inline in lessons instead of in iframes.
- feat Preview assessment blocks as summary cards in the lesson editor Lesson editor now shows lightweight preview cards for quizzes, assignments and exercises instead of full components.
- perf Index the columns permission query conditions filter on Eight doctypes now have search indexes on columns used by permission query conditions, eliminating full table scans on every list/report query.
- fix Add vertical padding around the sidebar user dropdown Sidebar user dropdown now has proper vertical spacing.
See all 46 changes
- fix Render and save an assessment block on insert Embedding a quiz in a lesson now renders and saves correctly instead of appearing blank until refresh.
- fix Drop the border around non-assessment lesson embeds Embedded videos and media no longer show a 1px outline; assessment blocks keep their border.
- fix Put the cursor in Title when adding a chapter The cursor now focuses the Title field when "Add chapter" opens, on desktop and mobile.
- fix Keep scorm package deletion inside the chapter's own package Deleting a SCORM chapter used `shutil.rmtree` on an unsafe path that could be traversed outside the chapter's directory. Import now strips unsafe SCORM metadata.
- fix Scope batch evaluator writes on LMS Certificate Batch evaluators could create, edit or delete certificates for any course, not just their assigned ones. Now scoped to evaluator's courses and batches.
- fix Put a question's explanation fields behind permlevel 1 Question explanation fields were hidden only in the UI. Now gated behind a permission level so students cannot read them before attempting.
- fix Keep students off assignment list pages after redirect Student access to `/assignments` and `/assignment-submissions` was redirected to Courses, but filter hydration immediately cancelled that navigation.
- fix Scope LMS Coupon to the courses and batches it discounts Coupons are now only editable by instructors of their courses/batches, preventing unauthorized coupon access.
- fix Cap how far an uploaded archive may expand Prevents ZIP bombs by capping expansion to 1 GB total, 10,000 members max, and 1 MB per member with 100:1 compression limit.
- fix Serve only the statistics charts from get_chart_data Endpoint now returns only the three public statistics charts instead of any Dashboard Chart by name, preventing unauthorized data access.
- fix Require quiz access to check an answer Unenrolled users can no longer check quiz answers by calling the endpoint directly.
- fix Check progress against the lesson's own course Progress checks now validate against the lesson's actual course, not the client-provided one, preventing cross-course progress manipulation.
- fix Scope batch authoring and lesson moves to the owning resource Batch and lesson edits now require ownership role, and live classes enforce batch permission checks.
- fix Lock enrollment course, member and batch after insert Enrollment core fields are now immutable after insert, preventing students from switching courses/batches via API.
- fix Only attach files the user uploaded for the document Assignment and job application uploads are now checked to ensure only files the user created are attached.
- fix Let evaluators and creators save batch/course meta tags Evaluators and creators can now save course/batch meta tags (title, keywords) with proper permission checks.
- fix Make the user category placeholder read as a prompt User category select now shows a visible placeholder instead of a greyed "Category" option.
- fix Vouch lesson media on the lesson its owner created Private lesson media remains accessible after an instructor is removed, by validating against the lesson not the instructor's current courses.
- fix Keep public and private course assets apart on import Course import now stores assets under separate `assets/files/` and `assets/private/files/` folders matching their URLs.
- fix Migrate Raven conditions stored against the old rule vocabulary Raven channel mappings created before v2.63 now sync correctly by migrating old rule names to new ones.
- fix Render schedule badges as the true instant Quiz intro card now shows correct Opens/Closes times for learners in different timezones.
- fix Sanitise JSON-shaped rich text on save Assignment comments and quiz results are now properly sanitized even when HTML is wrapped in JSON.
- fix Regenerate the root lockfile for the Playwright swap LMS CI now passes after Playwright replaced Cypress in package.json.
- fix Scope learner records to the course they belong to Course Progress, Video Watch Duration and Course Review rows now enforce that only the learner who owns them, course instructors, or Moderators can read them.
- fix Enforce can_modify_course on generic API doors LMS Course permissions now apply to read, write, delete and share endpoints, not just 11 dedicated API paths.
- fix Keep SCORM package location off the read every account holds SCORM launch file and package paths moved to permlevel 1, readable only by System Manager, Course Creator and Moderator.
- fix Scope Course Chapter to the course it belongs to Course Chapter now follows its parent course's permissions; only instructors and Moderators can edit or delete.
- fix Hold the share_enrollment lock for the patch's transaction Enrollment share migration now uses a FOR UPDATE row lock; overlapping runs block before reading and see the first run's shares.
- fix Bulk insert enrollment shares to stay under the write limit Share insertion now uses bulk_insert instead of single saves; sites with tens of thousands of enrollments no longer hit TooManyWritesError.
- fix Date pickers respect the site's configured date format Date field pickers now show the site's configured date format instead of always showing ISO YYYY-MM-DD.
- refactor Give RichTextEditor one outline chrome everywhere RichTextEditor now draws its own chrome with consistent styling instead of relying on call-site classes; variants: outline, subtle, ghost.
- refactor Update POT file Translation POT file updated.
- refactor Vouch bvnaik05 vouch bvnaik05
- refactor Sync translations from crowdin sync translations from crowdin
- refactor Merge 'main-hotfix' into 'main' Merge 'main-hotfix' into 'main'
- refactor Drop version-17-hotfix backport rules Develop now serves as the v17 line; version-17-hotfix backport rules removed.
- refactor Vouch more contributors Three contributors added to VOUCHED.td allowlist.
- refactor Configure vouch Vouch workflow added to gate pull requests; PRs from vouched users or maintainers are auto-closed, others can recheck.
- refactor Test against frappe version-15 CI now tests against frappe version-15; bench init and get-app are pinned to that branch.
- refactor Test against frappe version-16 CI now tests against frappe version-16; bench init and get-app are pinned to that branch.
- refactor Pin Course Evaluator writes to Moderator Regression tests added for Course Evaluator grants removed in prior commit; grants cannot accidentally return.
b
Builder
1 breaking · 2 new features · 8 fixes · 1 refactors
- feat Import a template group into its own folder Template import now groups pages into a folder, so internal page links work.
- breaking Keep one malformed dynamic route from breaking the others One malformed dynamic route no longer breaks all other dynamic page routing.
- feat Detach the preview into its own tab The preview can open in its own browser tab, Ctrl+P toggles between editor and preview tabs, and full screen mode hides the header.
- fix Render whole-number props without a trailing .0 Builder whole-number props like `29` now stay as `29` instead of rendering as `29.0`.
- fix Stop serving stale cached pages Component data scripts and client script changes now bust the cache correctly.
See all 12 changes
- fix Scope block client-script CSS in the canvas like the published page Builder canvas now properly scopes block client-script CSS, making `:scope` rules work.
- fix Let data.page_data carry dates and decimals Data scripts can now put record dates and decimals into `data.page_data` without 500 errors.
- fix Number copy titles inside the parentheses Duplicate page titles now number inside the parentheses as `Home (Copy 2)` instead of `Home (Copy) 2`.
- fix Clear inline span colours when Text Color is set from the panel Setting Text Color from the properties panel now clears inline span styles that were overriding it.
- fix Render dotted data keys whose root is missing Blocks copied to pages with missing root bindings (e.g., `hero.title` on a page with no `hero`) now render safely instead of throwing.
- fix Make translation actually callable as `_(...)` in page data scripts Page data scripts can now call `frappe._()` for translation; attribute access restrictions no longer block it.
- refactor For v1.35.0 release Page states (Draft, Staging, Published), sandboxed editor demo for published pages, template folder imports.
- fix Pinned comments Agents can now pin up to 5 internal comments on a ticket. Pinned comments show in a bar under tabs, newest first.
- perf Serve sidebar banners from one API Sidebar banners now served from a single `get_banners` API with dismiss via `dismiss_banner`, replacing per-banner endpoints and socket wiring.
- perf Group UI tests by page and shard UI tests Playwright suite reorganized by page instead of role for better test organization and added test sharding.
- perf Cover untested API modules and fix what they found 94 new tests now cover previously untested Helpdesk API modules.
- fix Small layout fixes on the ticket page Timeline no longer shifts after jumping to pinned comments, and the scroll centers consistently.
See all 13 changes
- fix Field-level permissions for agent-only ticket fields Portal customers could set agent-only fields (priority, sla, response_by) on their own tickets through the REST API. Now gated behind permission levels.
- fix Name a reply sent from a shared email after the agent Agent replies sent from a shared email flipped from agent name to email owner once the server row loaded. Timeline now consistently names the reply after the agent.
- fix Cover customers and contacts, fix manager edits on user contacts Agent Managers can now edit contacts with user accounts, with E2E test coverage.
- fix Agents & ticket permissions Agents can no longer create HD Agent records or delete tickets; agent role grants now go through User Invitation only.
- fix Keep a ticket paused past its deadlines while on hold SLA status no longer shows Failed when a held ticket is edited; hold time is preserved and deadlines are recalculated correctly.
- fix Pending row avatar and comment delete toast Pending comment row now shows the current user's avatar before save; delete toast works correctly.
- fix Include helpdesk in docker image Docker image build now passes apps.json via secret-files and verifies helpdesk is included before pushing.
- refactor Playwright suite for core journeys Playwright E2E suite added for core Helpdesk flows; six personas seed via REST and cover key journeys.
- feat Render Insights dashboards and charts inside desk pages Insights dashboards can now be opened as desk pages, and desk dashboards can be drawn by Insights with permission-filtered access.
- feat Import each stored table on its own cron schedule Stored table sync now runs on a per-table schedule instead of all-daily; operational dashboards can refresh hourly.
- perf Fail when vue-tsc does not run, and run it in CI TypeScript type-checking now properly runs in CI and fails explicitly if vue-tsc skipped.
- perf Bring the desk islands under their size budget Chart types other than bar and line are now lazy-loaded; dashboard island downloaded before first chart drops from 485 kB to 381 kB.
- perf Reload once when a deploy removed a lazy chunk SPA reloads once on missing lazy chunks from deploys instead of looping; reload is rate-limited to once per minute.
See all 11 changes
- perf Drop the ui_islands hook Frappe now reads islands from assets.json; the ui_islands hook is no longer used.
- fix Let a reader sort a table chart Dashboard readers lost sort arrows when charts moved to server-side derivation. Sort now goes with the request instead of modifying the chart config.
- fix Keep an appended table when the Data Store cannot list its tables Data Store append imports treated `list_tables` errors as "no table exists" and overwrote the table. Now propagates the error.
- fix Find a Data Store table whose name holds regex characters Table name lookup used unescaped regex, so tables like `orders_(eu)` were not found on append/upsert imports.
- fix Tell cohorts apart by ERPNext alone Telemetry cohorts now classified by ERPNext usage instead of Frappe Cloud state.
- refactor Fill claims shipped files when field is new Insights Custom Field migration now fills existing file claims on first install; unchanged files are no longer re-imported.
p
Press
6 new features · 13 fixes
- feat Add a date filter to site jobs Site Jobs page now has a Date filter with presets (Today, Last 7/14/30/90 days) and custom range picker.
- feat Add Recent Issues link to Help menu Help menu now links to known Frappe Cloud issues page; users see known problems before opening a support ticket.
- feat Daily Raven digest of sites whose backups keep failing New daily server-alerts digest lists sites that hit the daily failed backup limit. Same as the team email but in one message.
- feat Daily Raven digest of sites with no backup attempt Companion digest surfaces sites due for backup that the scheduler never picked up, complementing the existing failed-backups digest.
- feat Add Build Server Stats report New script report showing one row per build server and registry server, with throughput, load, and IO metrics for operators to monitor builds.
See all 19 changes
- feat Scan changed bench scripts with YARA YARA scanning is now driven by Wazuh file integrity monitoring on changed scripts; threats are logged for inspection.
- fix Hide unused chart toolbox buttons Dashboard charts had unused zoom, reset and brush buttons that did nothing. Removed them while preserving drag-to-zoom.
- fix Warn that backups may fail when the disk is full Disk full banners only mentioned sites may stop responding, missing that backups also fail, leaving data unprotected.
- fix Send failing and missed backups as one Raven message Daily backup failure alerts were sent as two separate Raven messages. Now consolidated into one with two tables.
- fix App Source doctype validation App Source validation fixes.
- fix Log the server activity once per incident, not per run Incident logging fired every 2 minutes for the life of a confirmed incident instead of once. Now deduplicated by job tag.
- fix Make the restore tables confirm button black, not red Restore Tables dialog's red confirm button signaled error instead of recovery. Changed to black to match recovery intent.
- fix Redeploy button on failed deploys Failed deploys now show the Redeploy button.
- fix Give restore jobs the backup timeout of the origin site Site restore jobs now use the origin site's backup timeout instead of the default 4h, preventing lock timeouts on large restores.
- fix Keep the user logged in after Stop Deploy Dashboard users are no longer logged out after stopping a deploy; session state is preserved.
- fix Cancel job through endpoint instead of doc method Cancel Job button now works for dashboard users; the endpoint bypasses doc-level permission checks.
- fix Mark all notifications read for the current team Mark-all-read now sends the team header; notification state updates correctly.
- fix Close dialog before opening Razorpay checkout Razorpay checkout dialog now opens cleanly after the payment dialog closes; no modal nesting issues.
- fix Reject apps without frappe dependency in pyproject GitHub app validation now rejects pyproject.toml without a frappe key; broken dependency declarations are caught early.
o
Other
36 new features · 9 speed-ups · 38 fixes · 27 refactors
- feat Publish the API reference and a generated client The docs site now publishes the WireGuard gateway API reference and a generated Python client.
- feat Send clear invitations and upload profile and team images Team invitations now email directly with an accept button, and users can upload profile and team logos.
- feat Replace host access grant with warpgate access Warpgate Access replaces Host Access Grant, giving time-limited access to one host, all hosts, or the Warpgate admin UI.
- feat Create the first team in console onboarding New users now name their own team in an onboarding dialog instead of getting an automatic personal team.
- feat Bulk invite Team admins can now invite up to 10 people at once from the team page, each with a role and resource.
See all 110 changes
- feat Enhanced sign in and sign up Every email now gets a 6-digit code; known emails sign in, new emails become accounts after verification.
- feat Add warpgate sign-in and host access grants Central is now an OpenID Connect provider so operators can give time-limited SSH access to region hosts through Warpgate.
- feat Move Atlas management traffic to private WireGuard Atlas now manages Metal hosts and service VMs only through WireGuard on the provider network; no management traffic on public addresses.
- feat Give customer devices WireGuard access to tenant VMs Customer devices reach private VM addresses through a replicated cluster of WireGuard gateway nodes, registered through a Central endpoint.
- feat Close a person's Warpgate sessions through the API The API now closes every live Warpgate session of one person, HTTP and SSH; Central uses it when admin access ends.
- feat Add bucket page New bucket page added to the console.
- feat Grant temporary host access through Warpgate People get temporary SSH access to Metal hosts through one Warpgate per region; Central grants and revokes access through the Atlas API.
- feat Misc improvements Web console and SSH now work for every image, SSH keys are optional, and server creation shows progress in the button.
- feat Accept a plan's transfer row on resize Server resize from the console now passes validation and logs failures with full traceback.
- feat Show page views in a meta line under the title Page reading time, views in the last 30 days and last edit now show in a line under the title; clicking views opens analytics.
- feat Upgrade to debian trixie and support openshift arbitrary uid Docker images now use Debian Trixie and support OpenShift restricted-v2 with arbitrary non-root UID.
- feat Redesign new server page Fresh UI for the new server creation page.
- feat Bring credit-funded provisioning into v0.2 Teams can create servers while credits cover the cost. Billing details only needed when credits run out.
- feat Show frappe storage provider in case pilot is central enabled Pilot now shows Frappe storage provider when Central is enabled.
- feat Open the app on the Overview page Wiki now opens to the Overview for managers instead of All Spaces; non-managers still see All Spaces.
- feat Bring back underline Wiki editor now has underline in the toolbar, bubble menu, and Ctrl+U shortcut.
- feat Internal links between pages Wiki pages can now link to each other with `[[page-name]]` syntax that survives page moves and route changes.
- feat Command palette, keyboard shortcuts, and copy/paste styles Studio now has a command palette, keyboard shortcuts dialog, and copy/paste style functionality.
- feat Add company-scoped campus support Campus is now a company-scoped site so multi-location institutions can split rooms, admissions, enrollment and fees while sharing one Company.
- feat Add the unified Suite shell, Home, and Files First complete slice of the unified Suite frontend with shared shell, Home page and Files section built on the Drive-layer.
- feat Add a Health dashboard and Pulse sidebar New Health dashboard answers whether anything is wrong, charting accepted events, rejection rates, latency and app-wide activity against baselines.
- feat Archive Pulse Event months older than 180 days to Parquet Old Pulse events are now archived to Parquet files; the 22.5M-row table stays bounded and queries stay fast.
- feat Captions with live transcription and speaker attribution Meet now has opt-in live captions using Nemotron STT with per-participant attribution, bounded VAD, and subscriber-only delivery.
- feat Bias captions for room names and Frappe terminology Captions now bias Nemotron for room names and Frappe-specific terminology; caption accuracy is improved with curated vocabulary.
- feat Measure STT delivery and provision dashboard STT delivery is now measured and provisioned on a Prometheus/Grafana dashboard; audio seconds and caption counts are exported.
- feat Disable search engine indexing for a page Pages can now be flagged to send noindex robots meta tag and X-Robots-Tag header; sitemaps and llms.txt still include them.
- feat Reorder blocks directly on the canvas Studio editor blocks can now be reordered by dragging on the canvas; family components are prevented from leaving their group.
- feat Tighten subject scheduling and restrict faculty to assigned subjects Subject Schedule now validates that faculty members teach the chosen subject; empty slots, disabled batches and overlaps are caught.
- feat Add bwh_payments to the marketplace registry BWH Payments (Stripe, Razorpay, Tabby, Telr integration) now appears in the Integrations marketplace.
- feat Add Reset SSH Host Keys to Stalwart Node New Reset SSH Host Keys action clears pinned keys after server reinstall; Provision stays blocked until keys are re-verified.
- feat Add bwh_shipping to the marketplace registry BWH Shipping (AfterShip and Shiprocket orchestrator) now appears in the marketplace.
- perf Migrate whatsapp ui to frappe-ui 1.0.0-rc.2 WhatsApp UI updated to frappe-ui 1.0.0-rc.2 with component API adjustments.
- perf Dropping "Managed" bucket creation on VM spawn Pilot no longer forces bucket creation on VM spawn. Teams can opt-in by manually creating buckets and setting credentials in Object Storage Settings.
- perf Bring refactor-ui into v0.2 UI refactor from feature branch is merged into v0.2 release.
- perf Drop empty strings/objects/arrays in JSON exports Studio JSON exports now omit empty fields; diffs are ~10% smaller.
- perf Studio editor fixes Canvas block labels now stay above blocks with proper styling; multiple editor issues are fixed.
- perf Prefix all DocTypes with WA WhatsApp DocTypes are now prefixed with WA to remove overlap with twilio_integration; existing sites are renamed in place.
- perf Cut setup time in PR workflows Cypress tests now run in single-tab mode; PR checks dropped from 5+ minutes to under 3.5 minutes.
- perf Make the GitHub header button a link GitHub button in docs header now uses the href prop instead of the renamed link prop; link works correctly.
- perf Show the rc version and a new tagline README badge now reads the rc dist-tag to show 1.0 release candidate version.
- fix Drop the page slug field from page settings The Slug field is removed so Route is the only URL control; PDF downloads now use the route instead of a stale slug.
- fix Fix Warpgate start and Atlas VM kernel upgrade Warpgate now owns its configuration and Atlas VM setup stops with recovery instructions when the kernel is too old.
- fix Treat a missing route as already deleted WireGuard Mesh treats missing routes as deleted, so reset and VM removal can recover from partial failures.
- fix Update the Warpgate atlas role on every setup The Warpgate installer now updates the `atlas-sync` role on every run, so running regions get new permissions without a full reinstall.
- fix Reset the idle clock when a VM starts Metal now restarts the idle clock when a VM starts, so a sleepy VM gets its full idle timeout after each start.
- fix Make the Atlas VM safe to upgrade and stop The Atlas VM runs the Node.js realtime server, setup updates existing Atlas apps, and stop shuts the guest down cleanly.
- fix Keep caption streams alive through audio inactivity Caption decoder and STT connections now wait for resumed audio instead of restarting on RTP inactivity.
- fix Use isinstance for the Interval arithmetic override Query arithmetic now checks types correctly instead of using hasattr, which falsely matched Table and QueryBuilder objects.
- fix Close all live Warpgate sessions on revoke Revoking host access now closes all open SSH sessions immediately instead of blocking only new sessions.
- fix Flag side effects in whitelisted methods that accept GET New semgrep rule catches whitelisted methods that accept GET requests but have side effects (commits, sends email, enqueues jobs) that bypass CSRF protection.
- fix Address Greptile review on #818 Sidebar navigation retained robots tag from previous page, page views logged wrong URLs, and analytics ingest held exclusive locks. Fixed all three.
- fix Typing lag on large pages Editor lag of 2–3 seconds on large pages caused by repeated tokenizer registration, triple markdown parse per keystroke, and inline base64 images. Now uses per-editor marked instance and external image storage.
- fix Print a second axis' data labels in its format Chart data labels printed in the series' format, not the axis', so a right-axis percent showed `0.3` next to a `30%` tick. Labels now use their axis' format.
- fix Allow lower-resolution cameras Desktop camera capture required 960 × 540 minimum, causing OverconstrainedError for lower-res cameras. Now requests 1280 × 720 preferred but accepts any supported resolution.
- fix Label the funnel tooltip value with its stage Funnel chart tooltips showed "Value 741" instead of the stage name. Now labeled "Active 741".
- fix Overflow of long ahh status in PWA Long status messages overflowed in the PWA.
- fix Weird scroll gap in the new server page Server page no longer has a weird scroll gap in Chromium.
- fix Keep TTY console viewers attached across VM restarts TTY console viewers stay connected across VM stop/restart and show the next boot.
- fix Remove an incomplete image import before a new import Incomplete image imports are now removed and reimported instead of causing "has no manifest" errors on every VM start.
- fix Harden console token bridge Console session bridge is now safe under concurrent opens and token window is shortened to reduce replay risk.
- fix Open someone else's shared draft read-only Shared drafts now open read-only and never create a fork; draft sync no longer saves a copy on image or code block rewrites.
- fix Keep the pivot table reachable on wide screens Pivot table toolbar menu now stays visible above 1280px; users on wide screens can now discover the feature.
- fix Trim image caption before serializing to markdown Image captions are now trimmed before writing to markdown; extra whitespace is removed.
- fix Sync Student and Guardian Contact Details report Enrollment report now references Course Enrollment instead of the deleted Program Enrollment; migration updates it.
- fix Drop frappe from required_apps in tally_migrator Frappe is now removed from required_apps; app install no longer fails on Pilot.
- fix Hash whatsapp profile name to avoid collision WhatsApp profile name is now hashed; multiple accounts no longer collide on the same profile.
- fix Crash on weekly loan disbursement with amortized BPI Weekly loan disbursement now calculates broken period interest; amortized BPI methods no longer crash.
- fix Update EPF wage ceiling to ₹25,000 PF wage ceiling raised from ₹15,000 to ₹25,000 effective 17 Sept 2026; older slips reprocess unchanged.
- fix Extra undo press after some actions that change nothing Slides editor no longer adds extra history entries for unchanged states; undo skips no-op actions.
- fix Shortcuts firing behind buttons and dropdowns Keyboard shortcuts now only fire when appropriate (e.g., Enter on a focused button runs the button, not the default action).
- fix Neutral slide outline in navigation panel Current slide outline is now neutral gray with a gap; focused slides show a darker ring instead of blue.
- fix Browser zoom over panels and popovers in editor Slides editor now cancels modifier-wheel events at the window level; zoom no longer breaks layout over panels and pickers.
- fix Hash snapshot uploads beside compression Metal now hashes disk snapshots while compressing; the disk is read once and progress starts immediately.
- fix Stalwart nodes start without configuration errors New Stalwart 0.16.20 nodes no longer log configuration errors on startup; spam filter rules are version-pinned.
- fix Stream image transfers without extra disk passes Image uploads now compress while downloading the next part; downloads write directly to ZFS without temporary files.
- fix Restore rounded production captions Production caption styling restored to rounded appearance.
- fix Align STT image Torch dependency STT image Torch dependency now allows NVIDIA base image; build runs on pull requests.
- fix Match caption fades to meeting surface Caption fade overlays now use meeting surface token instead of black; pill contrast and layout are preserved.
- refactor Align the IPv6 address layouts All private IPv6 layouts now use a 32-bit tenant ID and 16-bit VM/peer number on hextet boundaries; VM numbers count per tenant.
- refactor Migrate all JMAP calls to jmaplib Hand-rolled JMAP layer is replaced with the jmaplib package, reducing code and centralizing JMAP handling.
- refactor Use one network interface and an Elastic IP on AWS hosts AWS hosts now use one network interface for all traffic and keep a stable public address through an Elastic IP.
- refactor Convert ship-pr command into a skill The shipping command is converted to a compact, discoverable skill; obsolete .opencode folder removed.
- refactor Establish Diataxis contribution foundation Documentation restructuring begins with Diataxis structure, contribution guidelines, and incremental migration rules.
- refactor Add the team engineering playbook A shared engineering playbook is added for coding agents, covering workflow, environment, code, review and design.
- refactor Add the team engineering playbook Pilot adds the team engineering playbook for consistent agent behavior across team rules.
- refactor Add the API reference to the sidebar WireGuard gateway API reference is linked in the docs sidebar.
- refactor Clean up patches and docs for v0.2.0 Demo seed fixed, v0.1.0 data patches dropped, and documentation trimmed before v0.2.0 release.
- refactor V0.2.0 Version 0.2.0 release.
- refactor Use the latest ruff and keep parenthesized except tuples Ruff updated to 0.16.10, Python target set to 3.13 to keep except tuples parenthesized, and Markdown excluded from formatting.
- refactor Accept a develop bench (frappe 17.0.0-dev) Version constraints updated to accept prerelease development versions.
- refactor Require release_tests as a bench app, not a pip dependency release_tests is now an installable app instead of a git pip dependency.
- refactor Make the engine installable as a Frappe Cloud app release_tests now has hooks.py so it's recognized as a valid Frappe app on Frappe Cloud.
- refactor Accept a develop bench (frappe 17.0.0-dev) Version constraints updated to accept prerelease development versions.
- refactor Fix DocType settings dialog: drive through real UI, not a private API DocType settings test now uses the real Settings menu instead of a lazily-loaded private API.
- refactor Fix login button match: trimmed-text filter, not cy.contains() regex Login button selector now matches whitespace correctly in the live DOM.
- refactor Patch release v1.1.1 Patch release v1.1.1
- refactor Remove services page temporarily Remove services page temporarily
- refactor Promote v0.2 to develop promote v0.2 to develop
- refactor Release v16 release v16
- refactor Route client calls through Suite REST endpoints Suite Meet calls are now routed through REST endpoints instead of direct backend calls.
- refactor Release v16 Automated release.
- refactor V1.1.0 release First stable release of Frappe WhatsApp integration.
- refactor Remove the aurora and encore templates Aurora and encore template groups retired for their AI-generated aesthetic.
- refactor Reduce redundant GitHub Actions work Redundant GitHub Actions runs removed, saving ~11.5 minutes per merge to develop.
- refactor Add paced STT capacity harness STT load testing harness added with multi-replica pacing and privacy-safe comparison reports.