Weekly report
Frappe and ERPNext changes, 20 Jul to 26 Jul 2026
299 changes merged: 6 breaking, 70 new features, 22 speed-ups, 164 fixes, 37 refactors.
Breaking changes
Read these before you update. They can change how your site or app works.
- breaking Accept list payload for trans_items in update_child_qty_rate Frappe's type validation was rejecting legitimate JSON list payloads from clients, breaking the API despite the payload being valid.
- breaking Remove invalid doc.guardian reference breaking guardian search functionality Guardian search was filtering with a nonexistent field, blocking users from linking Guardians to Students via the Relations tab.
- breaking Remove conflict markers from frappe version requirement Backport merge left unresolved conflict markers in `pyproject.toml`, breaking TOML parsing and making bench unable to read the dependency.
- breaking Accept dict target_doc in mapper endpoints With native JSON request bodies, `map_docs` forwards `target_doc` as a dict, breaking all "Get Items From" buttons; now accepts dict/str/Document.
- breaking Create default warehouses with untranslated names Warehouse names were translated at creation, breaking opening-stock fallback lookups from sessions in different languages.
- breaking Read serial and batch flags from Item in Stock Balance's SLE query Stock Balance query was missing `has_batch_no` and reading `has_serial_no` from wrong column, breaking batch/serial consumption matching.
- feat Silent autosave status and lighter builder chrome Print builder autosave is now silent when saved, shows brief "Saving…" only during requests, and sticky red "Save failed" on error; drops "Reset Changes" and one-item section headers.
- feat Open builder preview in a modal instead of a dock Print preview now opens as a centered modal over the builder instead of a docked rail; gives preview full width and matches on-demand UX.
- feat Full screen toggle for the builder preview Print builder preview can now toggle full-screen; same iframe grows to viewport with Esc or shrink button to restore dock.
- feat Add guard hooks to open_mapped_doc Adds sanctioned extension point with `add_mapped_doc_guard()` and `should_open_mapped_doc()` to intercept before opening mapped documents.
- feat Add print option in form menu on mobile Print action now appears in form menu on mobile devices for easier access.
See all 71 changes
- feat Web Form: add request-key access for one-time links Web forms can now be shared via one-time private links with pre-filled context, enabling secure workflows for non-users.
- feat QUERY HTTP method (RFC 10008) Frappe API now supports RFC 10008 QUERY HTTP method for GET-like transaction semantics with POST-like body handling.
- feat Store builder snippets in a DocType Print Format snippets moved from localStorage to a DocType, making them exportable and shareable across sites/devices.
- feat Resend user invitation API added for resending user invitations.
- perf Perf!: Derive RTL CSS from compiled LTR CSS RTL CSS now derives from compiled LTR output instead of recompiling with rtlcss; ~1.6x faster style build overall.
- perf Compile styles with sass-embedded Switched from legacy async `render()` to sync sass-embedded, making style compilation ~2.4x faster.
- perf Cache empty allowed pages/reports to avoid per-workspace rebuild Empty pages/reports cache now hits correctly; fixes cache miss for users without Report permission.
- perf Build!: target ES2020 by default Build target raised from IE11 to ES2020 (~2020 era browsers), enabling modern language features.
- perf Drop autoprefixer Removed autoprefixer for dead-browser prefixes (ES2020 baseline); saves ~0.45s per style build.
- perf Reduce dev server reloader watches Dev server now watches only Python code instead of entire repos (node_modules, .git, sites/); fixes inotify exhaustion.
- perf Drop caniuse, browserlist, vue component compiler, router, touch Removed dead dependencies no longer in use.
- perf Fix flaky link filter test in form builder Link filter test no longer flakes by waiting for awesomplete dropdown and committing filter value before apply.
- fix Fix query conditions fix(db_query): fix query conditions
- fix Export Link titles in Report View Report exports were showing link field names instead of titles, mismatching what Report View displays.
- fix Move standard actions in the top fix: move standard actions in the top
- fix Accept dict target_doc in get_mapped_doc Companion fix for native JSON request bodies; dict targets were crashing at permission check.
- fix Use a re-entry flag instead of freezing during mapped doc guard runs Freeze overlay at z-index 2000 was covering confirmation dialogs from guards (at z-index 1140), blocking user interaction; replaced with re-entry flag.
- fix Get_list_context called twice when rendering a portal list Portal list pages were calling the doctype's `get_list_context` hook twice, duplicating queries and sidebar work.
- fix Stable memory consumption while syncing Large GL syncs (1.5M rows) to DuckDB were accumulating memory; now drops consumed objects.
- fix Pass parent doctype when fetching child table link values Fetching a Link field from a child-table row was failing permission check because parent doctype wasn't passed to `get_value`.
- fix Unbuffered sync from mariadb to duckdb Batches rows into Apache Arrow columnar format for zero-copy DuckDB ingestion.
- fix Remove hover effect from column/table resize handle Column resize handle no longer darkens on hover, reducing visual noise.
- fix Notifications with the dock Notification panel now shows up correctly with the dock.
- fix Close the bordered child-table bottom and drop the doubled header line Fixed child-table styling: bordered tables now close cleanly without doubled header line.
- fix Re-hash vue-style bundle filenames after inlining CSS CSS-only edits now mint new bundle URLs instead of shipping under browser-cached ones.
- fix Missing doctype name in breadcrumbs Doctype name was missing from breadcrumb navigation.
- fix Update private workspaces on user rename When a user's email changes, their private Workspace documents are now renamed and updated.
- fix Harden OAuth login Replaces JSON-encoded state parameter with server-side cache and random single-use tokens to prevent OAuth state injection attacks.
- fix Store OAuth state server-side instead Google OAuth hardening with server-side state storage instead of JSON encoding.
- fix Awesombar should up only once Awesomebar modal no longer renders twice.
- fix Handle orphan doctypes doctypes Orphaned doctypes no longer cause errors during sync operations.
- fix Preview in print format builder for cancelled documents When print format settings disable printing cancelled/draft documents, those documents no longer appear in the preview filter.
- fix Detach duration picker to avoid css issue Duration picker now renders detached to avoid CSS stacking context issues.
- fix Duplicate title in list view settings dialog Removed duplicate title in list view settings dialog.
- fix Remove s3/gh code assets fetching logic Removed unused S3/GitHub code asset fetching that was causing 1-2s build delay.
- fix Disable Werkzeug debugger Development server no longer exposes Werkzeug interactive debugger.
- fix Redact email message after it is sent Sensitive content in welcome and password reset emails is now redacted from the Email Queue after successful delivery, preventing password setup links from sitting in the database.
- fix Add permission checks to prepared_report & query_report Hardens report access by adding permission validation to prevent unauthorized access.
- fix Connected app: add permission check & sanitize redirects Prevents redirect injection and unauthorized app flows.
- fix Persist allow_bulk_edit for custom table fields Allow Bulk Edit checkbox was auto-unchecking on save for custom fields; added missing column to Custom Field doctype.
- fix Empty state text for list views Fixed button styling and simplified empty state messaging in list views.
- fix Broken spacing in email templates Redesigned email containers with proper card layout, padding, and typography.
- fix Fix pytz to filter out deprecated timezones Timezone API now excludes deprecated entries like Asia/Calcutta using pytz instead of zoneinfo.
- fix Respect select field ordering System console output columns are no longer forced to sorted order.
- fix Dock the preview, move print settings to a dialog, section radius Print Format Builder preview now docks beside the canvas with live refresh and improved print settings UI.
- fix List view filter on child table link field with ignore user permissions Filtering by child-table Link fields with Ignore User Permissions no longer fails validation.
- fix Show a session expired message and redirect to login instead of "Method Not Allowed" Expired sessions now show a clear message and redirect to login instead of cryptic "Method Not Allowed" errors.
- fix Check image before trying to load in print Print formats now skip empty image attachments instead of attempting to load them.
- fix Restore compact email button size Email button sizing regression from spacing redesign is reverted while keeping dark colors.
- fix Don't flag builder blocks as missing fields in the outline Builder-only fieldtypes (Repeater, Spacer, Divider) no longer wrongly report as missing fields.
- fix Make shell selection module first Sidebar selection is now module-based instead of role-based.
- fix Make the create new button subtle Create new button styling is now more subtle.
- fix Rename workspace missing icon in db Workspace icon naming is corrected in database.
- fix Add ignore_permission param to remove_user_permission util User permission removal now accepts ignore_permission parameter.
- fix Give datatable a definite height on mobile Query reports on mobile now render with proper datatable height so HyperList virtual scrolling works.
- fix Multiple changes in duckdb sync DuckDB sync now uses db_port from frappe.conf, shows filenames, ignores links on cancel, and doesn't set primary key.
- fix Collapse interaction for dock Workspace dock collapse interaction is now working.
- fix Rename hook to add_app_to_dock Hook renamed for consistency.
- fix Rename to add_to_workspace_dock Hook renamed for semantic clarity.
- refactor Bump pypdf to 6.14.2 for CVE fixes Fixes four DoS CVEs in pypdf (CVE-2026-59935/59936/59937/59938), all requiring maliciously crafted PDFs.
- refactor Use db.set_value for mark_as_read / mark_all… Notification marking now uses `db.set_value` instead of direct SQL.
- refactor Use pinia instead of vuex for store in kanban Kanban store migrated from Vuex to Pinia.
- refactor Remove dead code and dedupe the print format builder Print format builder cleanup removing dead code and deduped CSS; net −227 lines.
- refactor Bump datatable to 1.20.7 chore: bump datatable to 1.20.7
- refactor Release v15 chore: release v15
- refactor Release v16 Release v16
- breaking Accept list payload for trans_items in update_child_qty_rate Frappe's type validation was rejecting legitimate JSON list payloads from clients, breaking the API despite the payload being valid.
- breaking Accept dict target_doc in mapper endpoints With native JSON request bodies, `map_docs` forwards `target_doc` as a dict, breaking all "Get Items From" buttons; now accepts dict/str/Document.
- breaking Create default warehouses with untranslated names Warehouse names were translated at creation, breaking opening-stock fallback lookups from sessions in different languages.
- breaking Read serial and batch flags from Item in Stock Balance's SLE query Stock Balance query was missing `has_batch_no` and reading `has_serial_no` from wrong column, breaking batch/serial consumption matching.
- feat Block sales invoice submit when customer overdue exceeds threshold Backport of credit limit enforcement: blocks Sales Invoice submit when a customer's overdue amount exceeds configured limit unless the user holds a bypass role.
See all 46 changes
- feat Make Shipping Rule Cost Center optional with company default fallback Cost Center on Shipping Rule is now optional; falls back to company default, avoiding P&L account validation errors for income accounts.
- feat Proforma Invoice against Sales Order New submittable, non-accounting `Proforma Invoice` doctype (posts no GL/stock) for advance payments, created only from Sales Order with per-line Quantity/Amount basis.
- feat Warn when a draft linked document already exists When creating a follow-up document (e.g. Delivery Note from Sales Order), confirmation dialog warns if a draft linked to the same source already exists with clickable links.
- feat Made territory field multi select Territory field on accounts receivable reports now accepts multiple selections.
- perf Reuse shared date range validation across reports Consolidated duplicated from_date/to_date validation across tax_withholding_details, tds_computation_summary, batch_wise_balance_history, cogs_by_item_group into `validate_mandatory_date_range()`.
- perf Use get_root_of for Item Group root resolution Replaced hand-rolled parentless-group query with `get_root_of()`, matching sibling tree doctypes.
- perf Drop unused operation_row_number field from Job Card Job Card's `operation_row_number` field never worked and is dead code; now a dialog prompt selects the operation row instead.
- perf Scan link fields once per table in company restriction check Link field scan hoisted out of row loop in company restriction check; 100-item invoice reference walk cut from 2.8ms to 0.1ms.
- fix Ignore permission while deleting user permission fix: Ignore permission while deleting user permission
- fix Respect user permissions in party dashboard company list Party dashboards were bypassing user permissions and iterating over all companies, exposing restricted data on forms.
- fix Map MT940 per-transaction reference from :61: customer_reference MT940 import was using the statement-level reference for all rows (making them indistinguishable) instead of the per-transaction reference.
- fix Enable the 'Include Zero Stock Items' filter by default to show zero-stock items in the Stock Balance report fix: enable the 'Include Zero Stock Items' filter by default to show zero-stock items in the Stock Balance report
- fix Map pick list customer to delivery note when no sales order fix: map pick list customer to delivery note when no sales order
- fix Gate company restriction fields behind permlevel 1 Restricts `restrict_to_companies` and `allowed_companies` fields to master-manager role (permlevel 1) instead of all write-access users on Item, Customer, and Supplier masters.
- fix TypeError in get_batches_by_oldest for mixed batch expiry Fixes crash when a warehouse has both dated and non-expiring batches; expiry_date is nullable but sort was comparing directly.
- fix Do not translate root Item Group lookup key Non-English setups stored the root under a translated name, making new groups save with blank parent and become uneditable second roots; now uses `get_root_of`.
- fix Do not translate default record lookup keys Company creation was looking up Department root via `_(\"All Departments\")`, missing it on non-English sites and corrupting the tree.
- fix Rebalance batch slot values at the pooled rate when driven negative Batch valuation showed small negative bucket values when consumption drove a slot negative; now spreads batch pool value across slots proportional to qty.
- fix Guard against missing is_your_company_address custom field on Address Controller reads `is_your_company_address` as a bare attribute, crashing with AttributeError if the optional custom field is missing (e.g. after interrupted migration).
- fix Production Plan raw material qty calculation and bin reservation When same raw material appears in multiple Production Plan rows, safety stock and MOQ were added per-row instead of once; now reserves it as a floor.
- fix Map pick list customer to delivery note when no sales order Creating a Delivery Note from a Pick List without a linked Sales Order left the Customer blank; now falls back to the Pick List's own Customer.
- fix Respect selected BOM when creating work order for variant item Non-default BOM selection was silently reset to the variant's default BOM; now only substitutes for template BOMs.
- fix Drop translation marking from default warehouse names Warehouse names were marked for translation at creation but never actually display translated (docname carries untranslated company abbr); removed marking.
- fix Restore Save button on reverse journal entry Save button was missing from reverse journal entry form.
- fix Incorrect creation time at the time cancelling an entry Document creation time was incorrectly set when cancelling entries with same posting datetime.
- fix Log exception instead of swallowing in notify_errors Error logging now reports exceptions instead of silently swallowing them.
- fix Enforce company restrictions at transaction level Masters restricted via Restrict to Companies now validate on transaction save, preventing items/customers/suppliers from being used in unauthorized company transactions.
- fix Seed cancelled voucher replay from before its posting datetime (v15) Cancelled voucher replay now uses the correct previous balance, preventing double-counting when SLEs share the same posting datetime.
- fix Get reserved batch qty precision from settings Reserved batch comparison now respects field precision instead of hardcoding 6 decimal places.
- fix Get reserved batch qty precision from settings (v16) V16 backport of reserved batch qty precision fix.
- fix Apply default accounting dimensions reliably on new documents Accounting dimensions weren't populated on new Sales Orders due to timing race with async fetch; now applied via callback.
- fix Rescale stock ageing FIFO slot values on stock reconciliation Stock Ageing showed negative bucket values when revaluing existing stock; each slot's value is now re-derived as qty × valuation_rate.
- fix Sync process loss percentage when FG qty changes Manufacturing rework now re-derives stale process loss percentage when finished goods qty changes.
- fix Show transaction currency symbol in Payment Request schedule dialog and reference table Multi-currency Payment Requests were showing company currency symbol instead of transaction currency.
- fix Ensure payments app installed on the site in payment_app_import_guard Prevents errors when payment operations run before the payments app is installed.
- refactor Move new-doc route options to StockController Route options moved from TransactionController to StockController so Stock Reconciliation and Stock Entry share Batch/SABB prefill.
- refactor Settings map cleanup chore: settings map cleanup
- refactor Better description for posting datetime for naming series field chore: better description for posting datetime for naming series field
- refactor Release v15 Release v15
- refactor Release v16 Release v16
- refactor Remove `apiclient` Remove `apiclient`
- feat Add Contract link in Employee Connections section Contract doctype now appears in Employee connections dashboard.
- feat Filter system users in department approver tables Department approver fields now filter to show only System Users, preventing Website Users from being selected.
- fix Correct salary slip naming when created via data import Data Import was generating wrong salary slip names (e.g., `Sal Slip/None/00001`) because default_series read unset employee field; now lazily evaluated.
- fix Exclude disabled users from approver list Disabled users no longer appear in leave, expense, and shift approval searches.
- fix Skip expire_allocation for already-cancelled Leave Allocations Leave expiry no longer processes cancelled allocations.
See all 11 changes
- fix Exclude cancelled Vehicle Log records from service expense report Service expense totals no longer inflate from cancelled vehicle logs.
- fix Exclude cancelled Attendance records from employee timeline Employee dashboard timeline now filters out cancelled attendance entries.
- fix Doctype settings map Standardizes doctype settings metadata across HRMS.
- refactor Release v16 Release v16
- refactor Release v15 Release v15
- refactor Explicitly whitelist fields in create_salary_slips_for_employees Explicitly whitelist fields in create_salary_slips_for_employees
- perf Migrate Editor to CommentBox and EmailEditor component ref: migrate Editor to CommentBox and EmailEditor component
- fix Breadcrumb preserve query params, PrimaryDropdown Layout, box shadow in email activity card fix: breadcrumb preserve query params, PrimaryDropdown Layout, box shadow in email activity card
- fix Load a single prosemirror-model in production builds Production builds were loading multiple instances of prosemirror-model; now unified.
- fix Upgrade frappe-ui to beta.24 and resolve UI regressions Button icon handling, list controls, text inputs, and settings pages fixed after frappe-ui upgrade.
- fix Lead/deal report 500s when a child-table column is selected Permission conditions now properly qualify column names to avoid ambiguity when child tables join.
- feat Raven membership integration Raven integration for LMS: registers rule types (All Enrolled Students, Students of Courses/Batches, Staff), evaluator, and Raven sidebar panel.
- fix Inline pdf.js PDF viewer for iOS Safari + macro fixes PDFs now render via pdfjs-dist to `<canvas>` instead of ``, enabling scroll on iOS; adds continuous scroll, zoom, pinch-zoom, and error states.</canvas>
- refactor Merge 'main-hotfix' into 'main' chore: merge 'main-hotfix' into 'main'
b
Builder
4 new features · 1 speed-ups · 1 fixes · 2 refactors
- feat Inform users when the site is in read-only mode Builder now shows a message when the site enters read-only maintenance mode instead of silently failing saves.
- feat Invite users to Builder Site members can now be invited to Builder by email without going through Desk; invitees get Website Manager role on accepting.
- feat Align border control with spacing split-mode inputs Border control now supports split-mode inputs (top/right/bottom/left) matching spacing and border radius layout.
- feat Load real italic faces through the ital axis Google Fonts loader now requests italic axis alongside weight, so italic text renders with real italic faces instead of browser-synthesised slant.
- perf Trim editor bundle and fix text editor memory leak Lazy-loads Google Fonts catalog, CodeMirror, and page script panel; fixes text editor memory leak in long editing sessions.
See all 8 changes
- fix Use only shorthand properties for margin and padding Blocks could accumulate conflicting shorthand and per-side margin/padding properties; spacing now uses only shorthand.
- refactor Rework the Users settings tab Users tab redesigned with compact search, invite dialog, pending invites with resend/cancel, and admin badges.
- refactor Extract dynamic value resolution into BlockValueResolver BlockHTML, TextBlock, and BuilderBlock now share dynamic value resolution logic via BlockValueResolver.
- feat Recent Activity card on Home dashboard Agents now see a Recent Activity card on home showing recently-acted tickets with action types (Replied, Commented, etc) and clickable rows.
- feat Rtl support RTL support backport with physical-to-logical Tailwind utilities and directional icon rotations.
- feat Display ticket priority as icon and level Replaces arbitrary `integer_value` on HD Ticket Priority with purposeful `level` field (Urgent/High/Medium/Low) and renders as icon + name.
- fix Attachment upload feedback + uploads while editing comments File uploads now show visual feedback with a spinner and disable the send button; uploading while editing comments now works.
- fix Set default portal settings for existing sites Fresh Helpdesk installs set `default_role` and `default_portal_home` but existing sites never received them; now applies via a patch.
p
Press
1 breaking · 3 new features · 16 fixes · 2 refactors
- breaking Remove conflict markers from frappe version requirement Backport merge left unresolved conflict markers in `pyproject.toml`, breaking TOML parsing and making bench unable to read the dependency.
- feat Add incident time and confirm noisy neighbours Investigation now accepts optional `incident_time` for a centered 12-hour window (instead of trailing 24 hours), and confirms noisy neighbor detection.
- feat Allow more actions on inactive sites Inactive sites now support reinstall, restore, migrate, and update operations; update_without_backup now matches schedule_update allowed states.
- feat Add playbook to update ProxySQL on proxies Playbook added to upgrade ProxySQL from 2.3.2 to 3.0.9 across all proxies with atomic backup and rollback.
- fix Set team from site instead of session user Offsite backup restores were failing because backup remote files were assigned to the wrong team (Administrator's) instead of the site's team.
See all 22 changes
- fix Fix branch-change tests broken Tests were hitting the GitHub API and failing; mocked the `frappe/__init__.py` lookup so tests stay offline.
- fix Enforce app-version compatibility on deploy App compatibility was validated on every save, causing deadlock when a release group had multiple incompatible apps; moved check to deploy time.
- fix Reload bench apps page on deploy update fix(ui): Reload bench apps page on deploy update
- fix Explain what makes a frappe version range invalid Error message for invalid version ranges didn't name the range or explain the cause; now clarifies what makes a range invalid.
- fix Set frappe requirement to >=15.0.0,<17.0.0 Prerelease version bounds were failing validation; corrected to use stable semver ranges.
- fix Render err html with err component in addsites dialog Error HTML in the add-sites dialog wasn't rendering properly.
- fix Raven channel name for alerting server health Channel name now follows slug convention: "frappe-cloud-server-alerts".
- fix Replace swap metrics with OOM for server health check Server health monitoring now tracks OOM instead of swap metrics.
- fix Continue to existing trial site btn instead of new site Quickstart now correctly shows "Continue" for users with existing trial sites instead of "Create".
- fix Send already-logged-in product signup through quickstart Logged-in users completing product signup are now routed through quickstart flow.
- fix Determine post-login redirect route entirely in backend Login flow now determines redirect route server-side instead of trusting frontend logic.
- fix Improve app-mismatch error when moving a site App mismatch errors now bold offending app names and link to documentation.
- fix Branch change for framework Framework branch changes are now allowed if major version matches the release group.
- fix Make partner lead page a lil responsive Partner lead page now renders functional layouts on mobile.
- fix Ignore failed-over proxies in wildcard skip check Wildcard DNS check no longer counts failed-over proxies as active, preventing per-site record misplacement.
- refactor Declare frappe version requirement Adds `[tool.bench.frappe-dependencies]` to `pyproject.toml` so bench validates Frappe version on get-app.
- refactor Bump ProxySQL setup image to 3.0.9 Bump ProxySQL setup image to 3.0.9
o
Other
1 breaking · 43 new features · 8 speed-ups · 57 fixes · 13 refactors
- breaking Remove invalid doc.guardian reference breaking guardian search functionality Guardian search was filtering with a nonexistent field, blocking users from linking Guardians to Students via the Relations tab.
- feat Integrated Code Editor [Experimental] Built with Monaco editor and frappe-ui; allows editing code directly in Pilot.
- feat Upgrade to frappe-ui v1 Upgraded Frappe Wiki to frappe-ui v1 (beta.25), migrated v1 component APIs, rebuilt editor chrome on frappe-ui atoms, and bumped tiptap to v3.
- feat Google Sheets keyboard shortcuts + fix whole-line select anchor Adds Shift+Space / Ctrl+Space / Ctrl+Shift+Space for row / column / whole-sheet select, Ctrl+Alt+=/- for insert/delete, and Ctrl+Shift+1…5 for format shortcuts; fixes Shift+Space anchor jumping.
- feat Homepage list view — header sort, toolbar search, full-width scroll Sheets homepage list now sorts from column headers (click to sort, click again to flip), toolbar search, and full-width scrolling; replaces separate "Sort by" dropdown.
See all 122 changes
- feat Add more anonymized telemetry feat(meet): add more anonymized telemetry
- feat Add more frappe models feat: Add more frappe models
- feat Versioned releases and in-app self-update Moved from git-tracking to versioned releases with in-app updates; GitHub releases include prebuilt frontend, `install.sh` pulls latest, Settings shows version with check-for-updates.
- feat LLM integration New LLM integration in settings with task debugging: setup in settings, explain/query errors with full context, stream output via SSE.
- feat Make a bench fully operable without root after install Privileged operations (nginx, certbot, supervisor, modsecurity) now run once in root installer pass or through scoped sudoers; bench user no longer needs passwordless sudo.
- feat Add Credentials settings tab to manage JMAP connection New Credentials tab under Mail Settings lets users view/update JMAP connection fields (Username, App Password, Server URL); Password is never prefilled.
- feat Server overview metrics Pilot integration for server overview metrics on the Central dashboard.
- feat Auto-link URLs and link preview hover card URLs (https/www/common TLDs) auto-detect and auto-link in cells; hover card previews with quick actions.
- feat Multi-line cells via Cmd+Enter with auto-growing rows Sheets now support Google-Sheets-style multi-line cells; Cmd/Ctrl/Alt+Enter inserts newlines, rows auto-grow to fit.
- feat Sheets homepage filters, recency groups, and server-side pagination Sheets homepage upgraded: ownership tabs (All/My/Shared), sort control (Modified/Name/Owner), recency groups (Today/Previous Days/Earlier), server-side pagination.
- feat Meet stats for nerds Developer stats panel for Meet showing detailed metrics.
- feat Responsive sidebar Mobile-responsive sidebar using frappe-ui desktop/mobile shell components and bottom-sheet for mobile.
- feat Meet links on existing events, richer meet row Meet links can now be added to existing events via new `create_meet_link` endpoint; event updates now preserve existing links.
- feat Store Entry browser to browse Tantivy search indexes Read-only Store Entry browser now extends to search indexes alongside Data/Blob stores using schema-agnostic `SearchIndexBrowser`.
- feat Actually unify sites and assets Unified list view for sites and VMs removes confusion about where site creation happens (Pilot, not Central).
- feat Navbar refresh, fix blank Breadcrumbs page, and speed up dev cold load Docs site polish: full-width navbar, sidebar styling, centered search, anchor link fixes, IntersectionObserver for active headings.
- feat Bench new-app command New CLI command to create a Frappe app.
- feat Databse Insights Adds database insights with lock wait timeouts, active connection counts, binlog purge information, and process list.
- feat Keep forwarded emails in the same thread New per-account setting to add `In-Reply-To` headers to forwarded emails so they thread with originals.
- feat Add basic DB analyzer support Basic database analyzer support with lock wait timeouts, active connections, and process list tasks.
- feat Complete llm hosting Completes LLM hosting service with console activation, API key issuance, and per-site enable via Pilot.
- feat Recoverable trash for deleted sheets Soft-deletes sheets to trash instead of hard-deleting; 30-day retention with recovery like Google Drive/Figma.
- feat Forward Deployment Adds forward deployment feature to Pilot.
- feat Slicers — floating value-filter controls Draggable in-sheet panels that filter by column values via checklist, reusing the existing sortFilter engine.
- feat Enable hot reload by default on dev benches Dev benches now hot-reload both Python and JavaScript by default without explicit bench.toml settings.
- feat Default screening on only for personal accounts Email screening now defaults to off; only personal accounts get it on by default, shared/delegated stay off.
- feat Add greptile rules feat: Add greptile rules
- feat Redesign event modal Calendar event creation modal redesigned with two-pane layout, grouped date/time card, participants rail, and human-readable repeat rules.
- feat Draggable corner radius handle Slides designer now offers draggable corner handles for round rectangles, images, and videos.
- feat Writer-style share dialog redesign Sheets share dialog now matches Frappe Writer/Drive style with unified typography and consistent design language.
- feat Google-Sheets formula UX — click-to-range, auto-close parens, range suggestion Sheets formula editor now supports Google Sheets parity features: click-to-extend ranges, auto-closing parentheses, and range suggestions.
- feat Add Sentry error tracking Error tracking now integrated with Sentry.
- feat Add Suite User and Suite Admin roles, simplify Mail/Calendar permissions New Suite User and Suite Admin roles replace blanket All role with owner-scoped, role-based permissions for Mail and Calendar.
- feat Custom event invitation emails with RSVP links Calendar now sends custom invitation emails with HTTP RSVP links, with configurable Mail Settings toggle.
- feat Rollback imports on failure JMAP importers (Mail, Calendar, Exchange) now stage imports atomically; failure at any point rolls back the entire batch.
- feat Unified assets list view Servers and sites now unified in single console map + list view, allowing single-site users to find their site and multi-site owners to see everything at once.
- feat Add missing indexes Performance indexes added for Invoice, Payment Attempt, Usage Rollup, Subscription, and Credit Ledger Entry queries.
- feat Add read-only SQL query command CLI tool now includes read-only SQL query command with interactive table results and piped/JSON output support.
- feat Slugify server subdomains Server subdomains are now automatically slugified and polished UI added for new server page.
- perf Path-gate node server test steps Collab-server and SFU-server tests now run only on relevant changes; mirrors existing frontend job change-detection.
- perf Class contained LLM providers (Lite/Frappe/Self-hosted) LLM provider refactoring for modularity.
- perf Format with Biome Code formatting consistency.
- perf Active state never resolving from isActive/route + clipped active shadow Sidebar active state now resolves from fallbacks correctly; fixed clipped active shadow.
- perf Clean up duplicated transition, handle, and shortcut code Editor refactor removes duplication in TransitionSection command-building, handle styling, and shortcut validation.
- perf Use SettingsRow instead of Switch Settings UI refactored for component consistency.
- perf Filter PermissionError and ValidationError in Sentry Sentry error tracking now filters out expected permission and validation errors.
- perf Replace Select components with Combobox UI refactor improves component consistency across Central.
- fix Clear frappe cache around app install/uninstall Frappe's install-app was reading stale module caches left by earlier calls, silently skipping doctype sync for newly installed apps.
- fix Preserve repayment_type before building GL entries on repost Loan Repayment Repost was rebuilding GL entries with the wrong account and voucher_subtype when `before_validate` hooks changed the repayment type.
- fix Paste without a priming click + refresh formula bar on paste Paste did nothing unless the grid was focused, and the formula bar showed stale values right after a paste operation.
- fix Pass is_private as false correctly fix(file): pass is_private as false correctly
- fix Include formula-cell values in selection Sum/Avg Selection stats were miscounting formulas by reading raw cell content instead of computed values.
- fix Handle errors when offline or server unreachable fix: handle errors when offline or server unreachable
- fix Hide comment action if we are creating a comment fix(writer): hide comment action if we are creating a comment
- fix Update collaboration avatars in real time Document loader wasn't shown on navbar due to missing reactivity; added `useCollaborationUsers` ref to track awareness users.
- fix Align CI and tests CI and test base classes were misaligned with the version-2-beta branch; added correct Frappe/ERPNext versions and changed test cases to use FrappeTestCase.
- fix False-positive page conflict error due to stale modified timestamp on resource/variable CRUD Resource and variable CRUD was triggering false-positive page-conflict errors.
- fix Import context menu in grid view Missing context-menu import in Drive grid view prevented it from opening.
- fix Show real sheet owner in Share dialog instead of current viewer Shared sheet's Share dialog mislabeled the real owner as yourself; `get_sheet` never returned `owner` field.
- fix Keep renamed sheet tab in place instead of jumping to the end Renaming a sheet tab moved it to the last position; now preserves position by restructuring the sheets object carefully.
- fix Re-baseline undo history after load so insert-column undo doesn't blank the sheet Inserting a column and pressing Undo blanked the grid; history baseline was initialized before sheet data loaded, capturing empty state.
- fix Skip frontend Node deps on released installs Released installs were pulling `node_modules` for the admin frontend despite never compiling it; now gates on `is_dev_install`.
- fix Enable systemd lingering for the bench user at install time Bench services run as systemd user units, but lingering was only enabled after MariaDB provisioning (the first `systemctl --user` caller), causing install to crash.
- fix Serve bundled admin UI on released installs instead of rebuilding Released installs were rebuilding the admin UI on every `bench init`, even though the tarball ships it prebuilt; now decides by version flag.
- fix Install Redis system-wide from the installer Every bench runs its own Redis, but the installer never installed it system-wide; `RedisManager.install()` tried to sudo-install at bench-init, failing without passwordless sudo.
- fix Enable lingering in the root pass, verify it in the bench-user pass Follow-up fix: moved lingering enable to root installer pass (where it belongs) and added verification in bench-user pass.
- fix Anchor release tarball excludes to repo root `tar --exclude` was matching patterns globally (e.g. `--exclude=benches` also matched `admin/backend/api/v1/benches/`), shipping incomplete tarballs.
- fix Screener polish, Screener settings tab, iOS install banner Mail screener UI polish: full-width explainer slab, Screener settings tab, iOS install banner as fixed bottom sheet.
- fix Refine device audio controls Polish to audio control UI.
- fix Ignore paused producers in stall detection Meet stall detection was flagging paused video/audio producers as stalled.
- fix Enable settings shortcuts Settings shortcut (Meta+Shift+,) now works across all apps.
- fix Misc sidebar issues Sidebar UI polish: fixed switch label colors and migration button spacing.
- fix Render SVG at zoomed size Server map SVG now renders at proper zoomed size.
- fix Active highlight for sidebar item Sidebar active state highlighting now works correctly.
- fix Misc fixes Slide editor improvements.
- fix Punctuation jumping when editing text elements Enabled contextual alternates on ProseMirror editor and fixed text run shaping to prevent punctuation from jumping vertically during editing.
- fix Mention dropdown stays dead after typing a name with no match Mention suggestions dropdown now re-opens after typing a non-matching query and deleting back to a matching prefix; was failing due to conditional root element rendering detaching popover content.
- fix Don't save -> write page on load Multiple `setPage` calls during page load were triggering unintended saves; now gates secondary setups behind a completion check.
- fix Fix notifications empty state alignment Notifications empty state now aligns with tab buttons via responsive left margins.
- fix Preserve tree expand/collapse state on column freeze Tree expansion state is now retained when freezing/unfreezing columns.
- fix Stack avatar group to the right Avatar group now stacks to the right for better layout.
- fix Allow moving a block inside a slot and deleting a slot from layers panel Layers panel now supports moving blocks into slots and deleting slots, helpful when the UI drop target is too small.
- fix Use alpha gray for focus and open item backgrounds Menu background no longer shifts when a submenu opens; focused and open states now both use alpha tokens.
- fix Properties panel stealing focus from text editor Properties panel writes no longer steal focus; color picker can be dragged, text highlighting persists, and arrow keys work in numeric inputs.
- fix Install app regressions Fixes installation regressions.
- fix Stop tooltip clip Tooltips no longer clip.
- fix Name the bench in the wizard's finish hints Setup wizard now names the bench in finish commands when multiple benches exist.
- fix Certfile test is root-only TLS certificate tests now handle permission-denied gracefully in non-root runs.
- fix SSL flag Removing SSL ready flag no longer takes away HTTPS from other sites.
- fix Monitoring fixes Ensures ping method is not tracked in frequent paths and missing data in uptime is correctly represented.
- fix Drop certbot quotes Certbot configuration no longer includes unnecessary quote escaping.
- fix Allow site operations in production Site operations now work in production by allowing passwordless sudo access to nginx.
- fix Smooth, tight-fitting document title input Sheets document title input no longer jitters on keystroke by removing width animation and using native input sizing.
- fix Resolve event masters via baseEventId so fresh events can be edited Freshly created calendar events can now be edited immediately by resolving masters via baseEventId instead of stale search index.
- fix Reset stalled receive connection Frappe Meet connection stalls are now recovered.
- fix Ask for device perms on demand in device settings Frappe Meet now requests device permissions on-demand in settings instead of upfront.
- fix Unify sidebar state and hide storage labels on collapsed Sidebar state is now consistent across sections and labels hide when collapsed.
- fix Stop the login layout from shadowing bare /mail Bare `/mail` URL no longer shows empty account creation card for logged-in users.
- fix Fill unpinned column before creating a 2nd column Meet video grid now fills a single column before wrapping to multiple columns.
- fix Forward sidebar-item slot to SidebarSection Sidebar component now properly forwards slot when using sections API.
- fix Add tsconfig for type stuff in admin dashboard TypeScript configuration added for admin dashboard.
- fix Harden ingest: validation, dedup, capture rules, event catalog Event ingestion validation hardened with dedup logic, capture rules, and event catalog.
- fix Namespace gateway payment id by provider Gateway payment IDs are now scoped by provider to prevent ID collisions across multiple gateways.
- fix Implicitly allow dropping in a component that has a default slot + other slot fixes Components with default slots can now wrap other components without explicit slot passing.
- refactor Use DesktopShell component and simplify sidebar collapse knob Header now sits within main layout instead of duplicated per page; sidebar collapse knob moved outside wrapper to fix popup issues.
- refactor Update dependencies chore: update dependencies
- refactor Release v16 chore: release v16
- refactor Consolidate Meet & Drive roles into shared Suite User/Admin Meet and Drive now use suite-wide `Suite User`/`Suite Admin` roles instead of module-specific ones.
- refactor Unify storage & search into suite.store with namespaces Storage and search layers unified into suite.store with shared namespace concept.
- refactor Move Rate Limit doctype and rate limiter util to Suite Core Rate Limit and rate limiter moved from Mail module into shared Suite Core layer.
- refactor DB analyzer Database analyzer refactored.
- refactor Move Data and Blob store from Mail to Suite Storage engine extracted from Mail into app-agnostic suite.storage package with namespace-scoped stores.
- refactor Cleanup unsued tasks & internal docs chore: Cleanup unsued tasks & internal docs
- refactor Derive Prometheus secret ownership Derive Prometheus secret ownership
- refactor Replace remnants of npm in backend with yarn Replace remnants of npm in backend with yarn
- refactor Update hooks to show the app in hrms dock Update hooks to show the app in hrms dock
- refactor Add basic overview of services functionality Add basic overview of services functionality