Weekly report
Frappe and ERPNext changes, 7 Sep to 13 Sep 2026
435 changes merged: 3 breaking, 104 new features, 15 speed-ups, 259 fixes, 54 refactors.
Breaking changes
Read these before you update. They can change how your site or app works.
- breaking Remove seven tests that cannot fail Removes seven tests that pass even when the code they protect is deleted, breaking the validator early-return guards in Stock Entry.
- breaking Validate shelf life for automatically created expiring batches Items with auto-batch and expiry enabled could be saved with zero shelf life, breaking inward transactions.
- breaking Frappe-ui: SidebarRail rename, xs–lg input scale, form typography and responsive List columns Breaking changes for v1 RC: SidebarRail rename, input scale refactor, form typography fix, responsive List columns.
Highlights
Favourite star in the header and image upload on identity
frappe · feat
Make the panel's people built-in editable
frappe · feat
Draw the record page's panel from page.panelSections
frappe · feat
The record page's field region — Details form, save channel, dialog hosts
frappe · feat
Persist the list's columns, sort and quick filters per person and per site
frappe · feat
The user avatar and its menu at the foot of the rail
frappe · feat
- feat Favourite star in the header and image upload on identity Adds a favourite star on page.header to toggle the reader's favourite and list everyone who favourited the record; enables image upload on the identity built-in.
- feat Make the panel's people built-in editable Panel people section now supports inline assign/unassign, share/unshare, and tag/untag from the record page.
- feat Draw the record page's panel from page.panelSections Panel now renders from a declarative `page.panelSections` list with three built-ins (Info, Activity, Comments) and doctype-defined Side Panel sections.
- feat The record page's field region — Details form, save channel, dialog hosts Builds the Details form region, save flow, and dialog infrastructure for the desk v2 record page.
- feat Persist the list's columns, sort and quick filters per person and per site Save list customizations per user and support site defaults for System Managers to set.
See all 109 changes
- feat The user avatar and its menu at the foot of the rail Add user avatar at foot of rail with menu for settings, theme, Desk v1 link, and logout.
- feat A Desk v2 row in desk v1's user menus feat: a Desk v2 row in desk v1's user menus
- feat Composer submitting state, footer slot, toolbar start and body fade Add submitting state, footer slot, toolbar start slot, and body fade animation to email/comment composers.
- feat List, ListFooter and ListBulkBar on frappe-ui's list molecule Exports `@framework/ui/experimental/List` with presentational List, ListFooter, and ListBulkBar components on frappe-ui's list molecule.
- feat Compose the generated list page on the list components Generated list page now composes list controls and experimental List module instead of drawing its own table.
- feat The record page's header row moves into PageFrame Record page headers now move into the shell's pinned page frame, staying in place while the body scrolls.
- feat The customize dialog replaces the arrange drawer The arrangement drawer becomes a CustomizeSidebarDialog mounted in the shell, opened by hash instead of overlays.
- feat A page frame with a pinned header row Added PageFrame component that provides a root for generated pages with pinned headers that teleport into DesktopShell.
- feat The shell frame on frappe-ui's components Built Desk v2's shell frame using frappe-ui's DesktopShell, Rail, and Sidebar components with proper scroll handling and layout.
- fix Record page and shell polish from a walk Small polish from a walk of the desk v2 record page: breadcrumbs refactor, record dropdown cleanup, icon bindings, and whitespace fixes.
- refactor Pin frappe-ui to 1.0.0-beta.63 chore(desk): pin frappe-ui to 1.0.0-beta.63
- feat Add `Ignore Versioning` setting for docfields New setting allows fields to opt out of document versioning, reducing version overhead for high-frequency updates.
- feat Page type New page type for crafting Frappe UI screens directly on desk pages.
- feat Fill Subject and Message from Email Template Notifications can now fetch Subject and Message from Email Templates via a new dialog.
- feat Record hooks.py handler calls on the timeline Hooks.py handler execution is now recorded on the timeline with hook name, app, duration, and query count.
- feat Delete all linked documents in dependency order Added "Delete All Linked Documents" dialog to recursively delete blocking documents in dependency order, resolving LinkExistsError issues.
- feat Process large linked document sets in the background Added background queuing for Cancel All and Delete All operations when more than 50 linked documents exist, preventing request timeouts.
- feat Dock interaction Added new Dock and Sidebar interaction patterns for improved navigation.
- feat Cancel linked documents in dependency order Fixed Cancel All to process linked documents deepest-first, preventing LinkExistsError when cancelling documents still referenced by submitted docs.
- feat Land the stored-script tier's tables, on Client Script and Form Layout Added Record view to Client Script and run_order field, giving the record-page engine a home for stored scripts without a new doctype.
- feat Draw the record page's header row from page.header Built record page header rendering from page.header engine, replacing page.headerActions with flat item list supporting left/right zones and client script naming.
- feat Home COMPATIBILITY.md and port the dialog layout files Moved COMPATIBILITY.md documentation to the main directory and ported Record Page dialog layout files to desk-v2.
- feat Mapreduce Added first-class MapReduce support for parallelizing long-running computationally-intensive work across smaller independent tasks.
- perf Cancel mapreduce tasks if job is cancelled MapReduce tasks now cancel when parent job is cancelled.
- perf Check docstatus before calling callback Added docstatus check before invoking callback.
- perf Replace probot-stale with actions/stale workflow Replaced archived probot-stale app with actions/stale GitHub workflow on a daily cron.
- perf Add code review guide and agent instructions Added code review guide with numbered rules (R1–R70) that reviewers and agents can cite, plus instructions for AI agents.
- fix Enforce client authentication Frappe's auth rejected OAuth HTTP Basic credentials before OAuthLib received them, and the OAuth validator accepted both Basic and POST secrets regardless of the configured Token Endpoint Auth Method, violating RFC 6749 section 2.3.1.
- fix Bind token revocation to clients Token revocation searched only by token hash without verifying the token belonged to the authenticated client, allowing any client to revoke another client's tokens in violation of RFC 7009 section 2.1.
- fix Bind refresh tokens to clients Refresh-token validation checked only the token hash and status, not the authenticated client, so Client A could redeem Client B's refresh token in violation of RFC 6749 section 6.
- fix Treat page_length=0 as no limit in link search MultiSelectList filters on translated doctypes showed "No values to show" because raw-SQL link queries received LIMIT 0 instead of respecting the no-limit convention.
- fix Dereference symlink in pre-build asset packaging The tar archive pointed to symlinks in node_modules that did not exist in pre-built assets.
- fix Fade email bottom edge only while more remains below Email fade gradient stayed visible at the very end of content; now collapses to transparent when scroll reaches the last line.
- fix FormLayout tabs select by value on frappe-ui beta.63, and a Link title before search FormLayout was binding `activeIndex` instead of `value` after frappe-ui beta.63, leaving tabs unselected; also adds Link title support before search state.
- fix Honour an explicit Currency Precision of 0 in System Settings Currency Precision of 0 was treated as unset across `get_field_precision()` and `fmt_money()`, ignoring explicit zero-decimal configuration.
- fix Add request back into render_safe_globals Breadcrumb rendering in print format needed the `request` object in template globals.
- fix Close inherited descriptors before the re-exec Bench runner leaks file descriptors across restarts because exec preserves non-close-on-exec descriptors; accumulation hits system limits after ~1000 restarts.
- fix Key naming rule counters per resolved prefix Document Naming Rules kept one counter for all resolved prefixes, so `.YYYY.` prefixes incremented across year boundaries; now keyed per resolved value.
- fix Reject blank search_term and cap page_length in get_names_for_mentions Prevent abuse of mention search by rejecting blank terms and capping results to 20 per page.
- fix Backfill the social login key configs fix(social_login_key): backfill the social login key configs
- fix Clear doctype cache when a workflow is deleted Clear doctype cache on workflow deletion to prevent DoesNotExistError on subsequent saves.
- fix Don't prefill child table when link is on the parent Stop prefilling child table rows when creating from Connections tab if link already exists on parent.
- fix Render overlays in the top layer Render island overlays in the top layer to prevent desk chrome from painting over dialogs.
- fix Translate only backtick-delimited identifiers for postgres and sqlite Only translate backticks that delimit SQL identifiers, not backticks inside string literals or comments.
- fix Align form builder selector icons with their input Align Icon, Color, and Phone field selector icons with their input containers in form builder preview.
- fix Handle missing preload library in Postgres Query Stats Show instructions when pg_stat_statements extension exists but server library is not preloaded.
- fix Implicitly fetch parent name for child queries in QB Auto-inject parent name field into child table queries to prevent silent data loss.
- fix Render website analytics group by column as text Escape grouped field values in website analytics to render as text instead of HTML.
- fix Dashboard count and connection filter use the wrong child table with a duplicate link field Use correct child table when dashboard connection link appears in multiple child tables.
- fix Enforce client binding on refresh token grant Implements RFC 6749 compliance for refresh token grants to prevent token reuse across different clients.
- fix Prevent Document.get_tags from dropping the first tag Legacy code used `[1:]` slice to strip a leading comma that modern Frappe no longer writes, accidentally removing the first tag instead.
- fix Fix dock dropdown Dock dropdown rendering fix.
- fix Correct the child table row form backdrop and remove duplicate button Row form backdrop rendered near-white instead of dimmed dark; "Insert Below" appeared twice with identical functionality.
- fix Notification panel not visible on mobile Notification dropdown clipped by collapsed mobile sidebar; pinned it to viewport instead.
- fix Add fade prop to TimelineContainer Adds optional fade prop to TimelineContainer, defaults to true.
- fix Move Filter, SortBy and ColumnSettings to frappe-ui's Popover slots Updated components to use frappe-ui's new Popover API with slot-based triggers and refined placement props.
- fix Allow list values for JSON fieldtypes in get_valid_dict JSON field validation rejected list values in get_valid_dict.
- fix Data import: run the import through the document's own importer `start_import` bypassed custom `get_importer` overrides, forcing apps to fork the entire method to customize import behavior.
- fix Fix(oauth): misc. oauth fixes Reverted due to breakages.
- fix Fix(oauth): require client authentication on token introspection endpoint Reverted due to breakages.
- fix Check reference document permission in auto repeat Auto Repeat did not check user permissions on the referenced document before writing to it or copying it during scheduled runs.
- fix Add ip revalidation on every hop Added IP revalidation on each redirect to prevent SSRF attacks and added safe-request timeout configuration.
- fix No access to dashboard shouldn't take the site down fix: no access to dashboard shouldn't take the site down
- fix Keep child table dropdowns anchored to the field when the page is scrolled Link/Autocomplete dropdowns in child tables were positioned incorrectly; now stay anchored to the field when the page scrolls.
- fix Keep the user on the same tab while navigating using prev / next buttons in form view Users now stay on the same tab when scrolling between records using prev/next buttons instead of jumping to the default tab.
- fix Html sanitize html in email without overwriting content Email sanitization now preserves existing content instead of overwriting it.
- fix Omit empty options from PDF link Print view PDF links now omit empty options to avoid broken links.
- fix Change dock based on doctype The dock now changes based on the current doctype when using the awesome bar to navigate between modules.
- fix Export query report dates as real for excel Query report date exports to Excel now use real date formatting instead of text.
- fix Replace menu with dropdown component Replaced a custom menu component with the reusable dropdown component.
- fix Correct pointer-events property in desktop title input Fixed typo `pointers-events` → `pointer-events` in title input CSS rule.
- fix Dark mode issues Fixed dark mode styling issues across multiple UI elements.
- fix Fix(oauth)!: require verified email before logging in via social login Hardened OAuth by fixing a boolean logic bug in email verification and normalizing verification signals across OAuth providers (Google, GitHub, Facebook, Office 365, Frappe-as-IdP). Users logging in via social login now have their email verified before account access is granted.
- fix Require client authentication on token introspection endpoint Added validation layer to require client authentication on the OAuth token introspection endpoint.
- fix Misc. oauth fixes Removed the deprecated Resource Owner Password Credentials Grant (RFC 9700 forbids it) and added client_secret validation in the authenticate_client endpoint.
- fix Scope read access to the referenced document Decoupled comment permissions from document access, allowing apps to restrict comment visibility (e.g. internal notes on support tickets) without overriding endpoints.
- fix Added owner check before attaching doctype info to File Added owner verification before attaching doctype information to files to prevent unauthorized access.
- fix Settle the panel's state before it is drawn Fixed second sidebar showing randomly by settling the panel state before rendering.
- fix Remove notification_title and notification_description Removed separate notification title/description fields that complicated notification rendering across channels.
- fix Hide bulk export when user lacks export permission Hidden bulk export action in list view for users with owner-only export permissions, while keeping it available in Data Export and report export flows.
- fix Keep chart data when last_synced_on write conflicts Fixed dashboard charts being lost when concurrent users generate results simultaneously and encounter write conflicts on the last_synced_on field.
- fix Surface progress and errors when generating report PDF Added progress indication and error messaging for long-running PDF report generation, fixing silent failures that left users uncertain if the report was still generating.
- fix Detect web tier concurrency without /proc Fixed concurrent_limit detection failing on macOS by detecting gunicorn via SERVER_SOFTWARE environment variable instead of relying on /proc.
- fix Prepared report automation flags the reference report instead of the custom report Fixed prepared report automation updating the wrong report, causing custom reports to never be flagged for caching.
- fix Check every core doctype in the permitted fields test Fixed flaky test that randomly failed when it landed on User doctype by checking all core doctypes instead.
- fix Clear include filters and hide column picker when a print format is set Fixed include filters leaking into the print template as a subtitle and column picker staying visible when a print format is selected.
- fix Bind column metadata filters Prevents SQL injection vulnerabilities in PostgreSQL column metadata queries via bound parameter values.
- fix Make custom button labels translatable fix: make custom button labels translatable
- fix Preserve valid distinct ordering Preserves ORDER BY in distinct queries on PostgreSQL when all ordered fields appear in the result set.
- fix Honor default user permissions Falls back to User Permission defaults when stored defaults are missing or not permitted for the user.
- fix Preserve query builder distinct ordering Extends distinct ordering preservation to query builder with support for aliases, qualified names, and grouped queries.
- fix Enable recorder query optimization Enables query optimization by reading PostgreSQL index metadata and MariaDB information schema with parameterized filters.
- fix Cast autoincrement names in joins Casts autoincrement name columns to varchar in PostgreSQL joins to fix type comparison failures.
- fix Support managed database ownership Supports managed PostgreSQL root users by checking permissions before setting site roles and revoking temporary access.
- fix Cast non-text fields for like filters Casts non-text columns to varchar before PostgreSQL LIKE comparisons to enable pattern matching on numeric fields.
- refactor Drop obsolete typing deps and overrides Removes pypika-stubs dev dependency and related ignore_missing_imports overrides now that pypika ships py.typed; updates imports to use the modules that define them.
- refactor Drop Navigation Item Type's label and icon columns Remove unused label and icon presentation columns from Navigation Item Type.
- refactor List view UI cleanup for mapreduce refactor: list view UI cleanup for mapreduce
- refactor Vouch for humedi chore: vouch for humedi
- refactor Merge develop into desk-v2 chore: merge develop into desk-v2
- refactor Build against frappe-ui 1.0.0-beta.63 chore(ui): build against frappe-ui 1.0.0-beta.63
- refactor Merge develop into desk-v2 Third sync of develop into desk-v2; includes @framework/ui List module.
- refactor Vouch @akurungadam chore: vouch @akurungadam
- refactor Merge develop into desk-v2 Merged 201 commits from develop to desk-v2, updating pypdf to 6.16.1 and fixing three CVEs.
- fix Allow parent item groups in filters Parent item groups are now available in Set Filters when users select Descendants Of, instead of being hidden by field metadata.
- breaking Remove seven tests that cannot fail Removes seven tests that pass even when the code they protect is deleted, breaking the validator early-return guards in Stock Entry.
- breaking Validate shelf life for automatically created expiring batches Items with auto-batch and expiry enabled could be saved with zero shelf life, breaking inward transactions.
- feat Show reserved stock in batch balance history Batch-Wise Balance History now shows how much stock is reserved for each batch using aggregated query.
- feat Add subcontracting receipt ledger previews Adds accounting and stock ledger previews to Subcontracting Receipt before submission without requiring data submission.
See all 72 changes
- perf Rewrite period closing voucher on mapreduce Parallelized period closing voucher processing using MapReduce.
- fix Calculate batch bundle valuation per unit Amending a Material Receipt to swap batch details inflated unit rate by dividing bundle value by 1 instead of actual bundle quantity.
- fix Stop the SLA link filter patches from aborting migrate on PostgreSQL Two migration patches queried JSON columns with a comparison operator that PostgreSQL does not support, blocking `bench migrate` on production systems.
- fix Coerce cost_allocation_per to float in BOM cost allocation BOM cost allocation rate comparison treated string and float values separately, failing when a rate was stored as text.
- fix List billable sales orders oldest first The Sales Invoice "Get Items From > Sales Order" picker re-sorted custom-query results by relevance, placing oldest orders last and disrupting selection order.
- fix Prevent disabled items from being used in BOM A BOM copied or amended retained disabled Item rows; the Item link field filter and validation were inconsistent.
- fix Add permission checks on `invoice_discounting.get_invoices` The method returned unpermissioned invoice data; whitelist enforcement now honors read permission on Invoice.
- fix Fix(regional)!: remove `irs_1099_print` whitelisted method Removed an obsolete whitelisted method that exposed unrestricted document access.
- fix Expect a naming rule counter per resolved prefix Updated test after frappe#42690 moved document naming counters from rule-wide to one per resolved prefix.
- fix Add permission checks on `execute_repost_payment_ledger` fix(accounts): add permission checks on `execute_repost_payment_ledger`
- fix Apply company restriction to Item Price Item Price now inherits Company Restriction from the Item it links to.
- fix Recalculate billing status of returned delivery notes Recalculate billing percentage for Delivery Notes that remain to Bill or Partially Billed after returns.
- fix Exclude fully billed orders from the invoice picker Exclude fully billed Sales Orders from Get Items From selection when invoice mapping checks pending quantity.
- fix Avoid TypeError on new Work Order when company is not set Fix get_default_warehouse() TypeError when creating Work Order with multiple companies and no default.
- fix Do not rebuild the Warehouse tree on an account map miss Stop treating missing warehouse account maps as corruption that requires tree rebuild.
- fix Recompute reference doc reqd on asset type change Recompute mandatory flags on purchase_receipt/purchase_invoice when asset type changes.
- fix Align monthly bucket labels with demand dates Fix Material Requirements Planning report bucket labels appearing one month ahead of demand dates.
- fix Cannot select Against Finished Good on customer receipt Link validation re-runs custom queries with `txt` set to docname, but `get_fg_reference_names` only searched `item_code`, rejecting valid Subcontracting Inward Order Item selections.
- fix Remove empty delivery stops after mapping Fetching Delivery Notes left an empty default Delivery Stop row that prevented saving.
- fix % Amount Billed exceeds 100% on fully rejected Purchase Receipts Billed % calculation used only accepted qty as denominator when rejected billing was on, inflating the percentage; now uses accepted + rejected qty.
- fix Stop counting received qty on non-stock invoice returns Non-stock Purchase Invoices don't write Stock Ledger Entries, so `received_qty` validation never ran; partial returns then locked out the rest of the invoice.
- fix Ignore disabled price lists on transactions Disabled Price Lists persisted in boot defaults and party defaults, prefilling orders that then failed on price fetch.
- fix Handle empty raw materials in workstation Selecting "Transfer Materials" crashed when Job Card's Raw Materials table was empty.
- fix Set item_name to fetch if empty in packing slip item Packing Slip overwrote custom item names from Delivery Note upon save, reverting to defaults from item master.
- fix Handle empty bom cost allocation Clearing Cost Allocation Per field caused TypeError during cost calculation; now normalizes empty values to zero.
- fix Guard inventory dimension lookup without reference document Empty Reference Document in Inventory Dimension caused server error; now guards lookup.
- fix Use correct field when reading previous stock closing balance Stock valuation used wrong field when reading prior period closing balance.
- fix Reset price list fallback when changing parties Changing customer/supplier kept old party's Price List selected if new party had no default.
- fix Calculate holiday list totals for half days Half-day holidays were counted as full days; now calculated as 0.5.
- fix Keep a dunning claimable until its interest is paid too Dunning marked as Resolved when principal was paid without interest/fee, making interest uncollectible.
- fix Add email permission check on send_emails Email send endpoints lacked permission checks, allowing unauthorized users to send emails.
- fix Add permission checks on send_proforma_email Proforma email send endpoint lacked permission validation.
- fix Read posting date confirmation setting from boot data Cached posting date confirmation setting in session boot to avoid extra settings lookup on every save.
- fix Reject disabled price lists in buying and selling Transactions could retain a disabled Price List during save or submit when the list was disabled in another tab.
- fix Enforce account field allow-list on financial report filters fix(accounts): enforce account field allow-list on financial report filters
- fix Add permission checks to Chart of Accounts Importer methods fix(accounts): add permission checks to Chart of Accounts Importer methods
- fix Restrict linked material requests to permitted documents fix(buying): restrict linked material requests to permitted documents
- fix Account for process loss in Production Plan Work Orders Production Plan quantity checks now account for recorded process loss on both finished-goods and sub-assembly Work Orders.
- fix Distribute additional costs when incoming items have no value When all incoming Stock Entry rows had zero basic amount, additional costs were not assigned; now distributes across incoming items using transfer quantity as fallback.
- fix Prevent excess process loss from inflating plan quantities Validates cumulative finished quantity plus recorded process loss against Work Order quantity to prevent negative Production Plan commitments.
- fix Bind issue split to its own timeline fix(support): bind issue split to its own timeline
- fix Carry accounting dimensions from Landed Cost Voucher fix(stock): carry accounting dimensions from Landed Cost Voucher
- fix Preserve rates for unsaved mapped rows Rate-locked source rows are now resolved from the current mapped item context before child names are assigned.
- fix Share transfer stock across Production Plan rows (v16) Transfer stock is now fetched once per item in stock UOM and consumed across requirements instead of being reused per batch.
- fix Apply MOQ once across Production Plan rows (v16) Minimum Order Quantity is now applied once across related Purchase demand rows and carries purchase surplus into later Sales Orders.
- fix Apply safety stock once across Production Plan rows (v16) Safety stock is now counted once across requirements for the same item and warehouse before transfers and MOQ.
- fix Sum consolidated sub-assembly required quantity (v16) Consolidation now sums both `required_qty` and `qty` fields for sub-assembly demands.
- fix Federal bank dark logo Fixed dark mode logo for Federal bank in banking module.
- fix UI cleanup and better statement parsing Improved bank reconciliation UI: search scroll resets to top, date filter is more accurate, UI is more compact, and statement importer correctly detects Cr/Dr values.
- fix User not able to set valuation rate zero in stock reco Fixed validation preventing users from setting valuation rate to zero in stock reconciliation.
- fix Fetch orders within billing allowance Fixed Sales Invoice picker and button to show orders within global or item-level over-billing allowance, making 100%-billed orders visible again when allowed.
- fix Apply MOQ once across Production Plan rows Fixed Minimum Order Qty being applied to each purchase row separately instead of once across combined requirements, preventing excessive purchase quantities.
- fix Subtract billed qty for zero-amount Sales Order rows Fixed zero-amount Sales Order rows being mapped repeatedly on every invoice due to billed quantity not being subtracted.
- fix Apply safety stock once across Production Plan rows Fixed safety stock being added to every raw-material row when projected quantity was negative, now applied once across all rows.
- fix Sum required quantity when consolidating sub-assemblies Fixed consolidated sub-assembly rows not summing required quantity, causing incorrect stock reservation for combined requirements.
- fix Share transfer stock across Production Plan rows Fixed transfer stock being reused across all production rows instead of being shared once per item, preventing inventory overspend.
- fix Support drop-shipped items in Gross Profit report Added support for drop-shipped items in the Gross Profit report by loading buying costs from Purchase Invoices, fixing missing cost calculations.
- fix Avoid full grid re-render per row in set_exchange_rate Fixed performance issue where refreshing exchange rates on large Journal Entries caused full grid re-renders per row instead of per-field updates.
- fix Use existing warehouse fixtures in Pick List tests Fixed Pick List tests on version 15 by using standard warehouse fixtures instead of non-existent test warehouses.
- fix Refresh cached production plans before assertion Fixed intermittent test failures by clearing request cache before final assertions in Production Plan tests.
- fix Check write permission in whitelisted document methods Added write permission checks to whitelisted document methods that mutate the document, preventing unauthorized changes.
- fix Add permission checks to whitelisted methods fix: add permission checks to whitelisted methods
- fix Add permission checks to BOM whitelisted methods fix(manufacturing): add permission checks to BOM whitelisted methods
- refactor Stop six tests from passing without running Fixes six tests that returned on MariaDB without calling skipTest and one test that ran only on fresh sites because its DDL setup survived the transaction.
- refactor Rename secondary item valuation type to "% of Component Cost" Secondary item valuation option `% of FG Cost` was misleading; renamed to `% of Component Cost` with migration patch for stored values.
- refactor Drop the Default Company type row's label key refactor(setup): drop the Default Company type row's label key
- refactor Note the framework casts like filters on non-text fields Documents that PostgreSQL automatically casts non-text fields for LIKE filters in get_all/get_list queries.
- feat Add unread notification filter with show all toggle HR notifications view now toggles Show All/Show Unread with unread default; pagination consolidated into single refresh helper.
- feat Add configurable option to mark absent on same day Add Absent Buffer (Days) field to Shift Type (default 1); set to 0 to mark absent same day.
- feat Add partially paid status for expense claim Expense Claims now show "Partially Paid" when partially reimbursed, differentiating from fully outstanding.
- perf Batch employee metadata lookup Fetch all employee metadata in single query instead of per-employee queries for reports.
- fix Remove Leave Period from Employee Grade connections Remove Leave Period from Employee Grade dashboard connections since the link doesn't exist.
See all 15 changes
- fix Reset hardcoded letter head on reports Remove developer-site letter head hardcoding from Employee Exits, Leave Ledger, and Income Tax Computation reports.
- fix Mark absent for overlapping shift assignments in auto attendance Fix auto attendance not marking Absent when employee has multiple overlapping shift assignments and no default shift.
- fix Load translations from the endpoint frappe v17 exposes Fix PWA translation loading by using frappe v17 endpoint instead of removed v16 method.
- fix Slip eval context Salary component evaluation lost custom fields during refactor; restored evaluation context.
- fix Validate salary structure for timesheet salaries Prevents Salary Slip creation from submitted Timesheet when employee lacks valid timesheet-based Salary Structure.
- fix Better api endpoint & perm check API endpoint and permission improvements.
- fix Handle zero payment days in payroll correction Payroll Correction raised ZeroDivisionError on zero payment days; now shows validation message instead.
- fix Show loan repayment in salary slip print formats Salary Slip printed with loan repayment subtracted but never shown, making totals unreconcilable.
- fix HR form cleanup Cleaned up HR form structure and removed redundant fields.
- refactor Patch release Patch release.
- feat Remove quick enrichment, better settings UI, better description picking Removed quick enrichment and improved the settings UI with better description picking for lead/deal enrichment.
- fix Timeline does not live-update for new emails or read-receipts Activities panel only subscribed to `docinfo_update` events for comments, ignoring communications socket events for new emails.
- fix Show quick filters in mobile list view Quick filter fields were only rendered in desktop ViewControls, so mobile users had to open a popover to filter by standard fields.
- fix Prevent conversion of lost leads Disabled lost-lead conversion UI and enforces restriction in conversion API.
- fix Translate Select field option labels in frontend Select field options rendered English labels from DocType meta even when translations existed; wrapping in `__()` now shows localized text.
See all 15 changes
- fix Keep POT updates in a single self-updating PR Weekly POT regeneration job now reuses single stable branch instead of creating dated branches, eliminating accumulation and merge conflicts.
- fix Resolve false not-permitted redirect and broken session expiry handling Fix rapid reload causing false not-permitted redirects; add return statement to abort navigation on in-flight request cancellation.
- fix Default view is now tracked per doctype instead of a single global slot Setting default view for one doctype no longer clears defaults for all other doctypes.
- fix Hide permlevel restricted fields from activity timeline Activity tab showed changes to fields the current user had no permission to read.
- fix Persist details bar width across page refresh Details panel width reset on every page refresh.
- fix Check read permission in get_call_log Added read permission check to the call log retrieval endpoint.
- fix Propagate no_of_employees to organization on lead/deal conversion Fixed employee count field being lost or reset to default when converting leads or deals to organizations.
- fix Deal contacts permission Added permission check before fetching contacts for a deal.
- refactor Remove calendar feature from frontend Removes all calendar and event feature code from CRM frontend.
- refactor Fail lint on unresolved imports Lint CI now fails on unresolved imports to catch import issues early.
- feat Add google api, calendar, badge assignments; redo settings ui Restructures LMS settings architecture into separate config/list/form pages for Coupons, Transactions, Payment Gateways, Zoom, Google Meet, and Badges; settings now URL-driven instead of modal state.
- feat Replace pager with wrapping question chips and add Previous Replace windowed question pager with wrapping numbered chips and add Previous button for better navigation.
- feat Add availability scheduling for quizzes and assignments Add opt-in scheduling to limit quiz/assignment availability to a configured time window.
- feat Feat(quiz)!: rebuild quiz authoring around a shared question bank Questions are now written once and reused across quizzes instead of being duplicated; a new Questions list shows every question on the site.
- feat Add Slovak language support and complete Czech translations Added full Slovak language support and completed Czech translations with corrections for UI terminology.
See all 23 changes
- feat Feat(raven)!: sync channel membership from LMS rules Added Settings > Raven to map LMS courses, students, and instructors to Raven workspace channels, with automatic membership sync following defined rules.
- fix Carry contact-us images inside the email instead of linking them Pasted images in Contact Us form arrived as links to private files; recipients' mail apps could not open them; now embedded as proper inline attachments.
- fix Let a student reach the evaluation scheduler on a course Certification page read course title with a `get_value` call on LMS Course, which students have no permission for; `get_certification_details` now returns the needed data.
- fix Stop offering evaluation slots that have already started today Evaluation slot picker showed today's past slots (e.g., 09:30 at 14:47) without comparing against the clock; validation rejected submission.
- fix Duplicate courses and batches in created lists Add `.distinct()` to course and batch queries to prevent duplicates when course has multiple instructors.
- fix Enrollment update Move enrollment count updates to after_insert/after_delete hooks and use atomic SQL to avoid race conditions.
- fix Resolve attributeError in count_matching Fix batch count query using outdated method that broke batch list footer.
- fix Improve text contrast in programming exercise submission Fix run button text color override and improve compiler error message visibility.
- fix Reveal the signup result banners on released frappe Make signup success/failure banners visible by wrapping relative-time text in span.
- fix Fix(lesson)!: stop lesson content being destroyed on save Lesson content JSON is no longer destroyed by HTML quote rewriting on save.
- refactor Email account setting Revamps email account settings UI, adds 7 new whitelisted endpoints gated to Moderator role, and adds security tests for anonymous and wrong-role access.
- refactor Migrate Cypress tests to Playwright and fix API guards Migrates from Cypress to Playwright, consolidates login to once per test run, enables parallel test execution, and fixes API calls on blank courseName.
- refactor Update POT file chore: update POT file
- refactor Revert "feat(raven)!: sync channel membership from LMS rules" Revert "feat(raven)!: sync channel membership from LMS rules"
- refactor Merge main-hotfix into main chore(release): merge main-hotfix into main
- refactor Merge main-hotfix into main chore(release): merge main-hotfix into main
- refactor Merge develop into main-hotfix Branch sync.
- refactor German update Updated German language translations and added missing translations.
b
Builder
1 new features · 13 fixes
- fix Open color pickers from the swatch only, and show the value in the New Token dialog fix: open color pickers from the swatch only, and show the value in the New Token dialog
- fix Move the color token dropdown from the picker popover to the Background field Token dropdown on color picker popover was read-only; moved it to Background field matching Text Color's pattern.
- feat Carry the page through its lifecycle events Page lifecycle events now carry page name, source (template/duplicate/blank/import), and block count for telemetry.
- fix Type colors into the Background field and keep its label in sync Allow typing hex, rgb, hsl colors or image paths into Background field with label sync.
- fix Use consistent title casing for shortcut and menu labels fix: Use consistent title casing for shortcut and menu labels
See all 14 changes
- fix Duplicate a standard page as a plain page Duplicating a standard page kept `is_standard` and `app` flags, opening read-only or writing duplicate exports.
- fix Hide popovers and dialogs on small screens Below 1024px the builder hides but open popovers/dialogs remained visible floating over the "Screen too small" message.
- fix Clear editor console warnings and errors Editor logged 8 errors and ~200 warnings from itself; marked component-valued registry items raw and fixed prop control issues.
- fix Match globe icon styling with toolbar icons Globe icon in the page title bar now matches the visual style of surrounding toolbar icons.
- fix Render form controls in the canvas as real but inert elements, and align property control label widths Native form controls now render as real elements in the canvas and option labels are edited inline without nesting rich-text editors.
- fix Reserve mono for code literals in the AI debug UI Removed mono font from stat-tile numbers and labels, keeping it only for genuine code literals like tool names and log output.
- fix Patch release fix: Patch release
- fix Close block context menu when a keyboard command runs Fixed context menu staying open on top of the keyboard shortcuts modal.
- fix Two keyboard shortcut bugs Fixed Ctrl+Shift+C leaking listeners and Ctrl+Shift+L being bound twice with a dead store field.
- perf Comments and notifications doctype migration Migrated HD Ticket Comment → Comment, HD Ticket Activity → Comment (Info), HD Notification → Notification Log with patches for schema, permissions, and data.
- fix Assignment notification backlog, deprecate replaced doctypes Migrated helpdesk doctypes to core equivalents; patches old notification backlog and deprecates replaced types.
- feat Agent skill for authoring workbooks over frappectl Added agent skill enabling agents to build and edit Insights workbooks on any site with frappectl, using only a shipped contract without server-side install.
- fix Read a money measure's currency from its data, not from the site Sales Performance dashboard printed the wrong currency symbol on KPI cards when filtering by Company because it used the site currency instead of the data's currency.
- fix Wait for readers before opening the warehouse for a write Fixed DuckDB warehouse import failures by waiting for read connections before opening the file for writing, addressing 169 of 323 failed imports in 30 days on insights.frappe.io.
- fix Keep one record per remote table when its name changes Fixed duplicate table imports when a PostgreSQL table name changes due to schema prefix editing by resolving names to their actual tables.
- fix Match the import log status a finished import writes Fixed table stats not reporting import duration by matching the correct import log status ("Completed" instead of "Success").
See all 7 changes
p
Press
12 new features · 20 fixes · 1 refactors
- feat Show the archived sites when a team has no live sites feat(dashboard): Show the archived sites when a team has no live sites
- feat Enable Wazuh in all servers Deploys Wazuh security agent across all servers for threat detection.
- feat Add set additional config button and group the actions Add Set Additional Config button to Server, Database Server, and Proxy Server forms for easier retries after job failures.
- feat Show the auto update window in the site dashboard Display auto update time window and site timezone in Configure Auto Update dialog.
- feat Link the restore doc in the archived site banner feat(dashboard): Link the restore doc in the archived site banner
See all 33 changes
- feat Add "Redeploy without cache" for cache build failures Add "Redeploy Without Cache" button on pipeline detail page for Docker build cache failures.
- feat Let teams pick their storage alert threshold `storage_alert_threshold_percent` setting (default 90, valid 50–95) on Server and Database Server; teams can warn earlier or later than hardcoded 90%.
- feat Warn about 30-day downgrade lock when upgrading to $50+ plan Displays downgrade lock constraint right on plan selection so users confirm before upgrading.
- feat Show who archived a site, when, and why Activity tab now visible for archived sites, showing archive actor, timestamp, and reason.
- feat Let users pick backup times from the dashboard Users can now change logical backup schedule from dashboard instead of desk, avoiding working-hour slowdowns.
- feat Show last plan change date in the change-plan dialog Displays previous plan change date and details when user opens Change Plan dialog.
- feat Alert on Raven when hourly backup success rate drops below 97% Backup health is now monitored hourly with Raven alerts when success rate falls below 97%.
- fix Block SSRF via customer webhook endpoints Webhook endpoints can execute requests from the Press control plane; three validation gaps allowed URLs pointing to private IP ranges and loopback addresses to bypass checks.
- fix Add server side validation for new site and server Unpaid teams were prevented from creating sites and servers only on the client; server-side enforcement now blocks unauthorized creation.
- fix Install rclone on servers created from an image Dashboard-created servers boot from pre-baked images and skipped the full setup playbooks that install rclone.
- fix Show only a server's own sites under a bench group Bench groups showed the entire group's site list under each server card; site count and deployment status badges also counted across the group instead of per-server.
- fix Pass proxy's IP Pass proxy IP for Nginx allow/deny firewall rules.
- fix Stop automated snapshots on Frappe Compute Disable automated snapshots on Frappe Compute (bare metal) which fail on every run.
- fix Read the chromium path from launchOptions Fix PLAYWRIGHT_CHROMIUM_EXECUTABLE_PATH environment variable being ignored.
- fix Allow parsing of anchor tag in notif panel fix(ui): Allow parsing of anchor tag in notif panel
- fix Name the app that lists frappe as a Python dependency Identify which app declares frappe as a Python dependency causing uv resolution failures.
- fix Require a minimum sample size before auto-disabling webhooks Webhooks were disabled on 70% failure rate with no minimum sample size, causing false disables on single or few events; now requires minimum attempts before auto-disabling.
- fix Show the exact time when hovering a relative date Tooltips carrying full datetime were never opening on relative time text; wrapping text in span fixed attachment.
- fix Search the servers list by name as well as title Server search only matched title, not name; now matches both so users can find servers by either identifier.
- fix Change the Performance Schema notice for shared hosting Same notice shown to all users even though Performance Schema is available only on dedicated servers; now differentiates shared vs. dedicated.
- fix Handle a branch deleted on GitHub App sources with deleted GitHub branches now show a clear error message instead of generic Action Required.
- fix Ship headless Chromium in the bench image Fixed missing Chromium in Docker images when print_designer is installed, resolving "Chromium not executable" errors on deployed apps.
- fix Add platform check when getting similar plans Added platform check to plan selection logic to prevent incompatible plan recommendations.
- fix Consider upgradable server for site/bench creation Updated server selection logic to consider server upgradability in addition to health when creating sites and benches.
- fix Include disk usage Added root-disk utilization alerting to server health checks with a 90% threshold.
- fix Switch to prepaid credits when card is not on stripe Handles payment failures for Razorpay UPI Autopay when token expires by switching to prepaid credits.
- fix Remove renewal card Allows partners to add/update company logo and adds a sales email field for partner communications.
- refactor Revert "Merge pull request #7405 from frappe/feat-configurable-storage-alert-threshold" Revert "Merge pull request #7405 from frappe/feat-configurable-storage-alert-threshold"
o
Other
1 breaking · 52 new features · 8 speed-ups · 58 fixes · 26 refactors
- breaking Frappe-ui: SidebarRail rename, xs–lg input scale, form typography and responsive List columns Breaking changes for v1 RC: SidebarRail rename, input scale refactor, form typography fix, responsive List columns.
- feat Track Pilot releases and keep one image per pair An image is now one Pilot release on one Frappe version; Cargo can follow Pilot's releases by itself with a new "Track Pilot Releases" setting in Cargo Settings.
- feat Add system image snapshots and release tracking commands Creates built Cargo images as Atlas System images and adds commands to enable or disable Pilot release tracking per site.
- feat Spawn the region's cluster without an operator Cargo now builds and sets up a region's Garage cluster on its own via scheduled ensure_cluster instead of requiring manual setup.
- feat Verify the image before it goes to Central The bake now verifies the image serves its site before handing the host to Central, using `pilot setup central` instead of a staged Python file.
See all 145 changes
- feat Configure Atlas from deployer settings Complete provider, DNS, catalog, certificate, and system image setup from one validated TOML file before the VM reports ready.
- feat Sync Pilot releases every minute Changes the sync_pilot_releases scheduler from hourly to every minute.
- feat Add --no-dev to skip apps' dev extras Adds --no-dev flag to skip apps' dev extras, fixing unresolvable dependencies on frappe develop.
- feat Add `pilot setup central` Adds a command to enable Central management from the CLI with validated hostname patterns instead of hand-editing config files.
- feat Track Pilot image releases Atlas enables Cargo Pilot release tracking after bootstrap image migration completes, with System Manager controls to enable or disable it.
- feat Ask for the default storage cluster Atlas now asks for the default storage cluster during setup.
- feat Settle the 1.0.0 API decisions Settles 14 API decisions for frappe-ui charts v1.0.0, including label props, data label display, and funnel percentage handling.
- feat Bake Pilot images for Central auto bootstrapping Baked Pilot images now boot as managed hosts awaiting Central credentials, reaching a running state without manual setup.
- feat AI settings section New AI settings panel in Raven for configuring AI-related features.
- feat Gateway nginx Adds nginx on gateway node to route between admin and S3 API, removing other dead ports.
- feat Take Atlas and Proxy bearer tokens Enrolment now accepts signed bearer tokens for Atlas and Proxy instead of key/secret pairs, enabling token-based auth.
- feat Publish gateway proxy routes Cargo publishes regional S3 and S3 admin domains through proxy before object storage cluster becomes Active, with wildcard domain mapping.
- feat Atlas integration Integrates Cargo with Atlas for infrastructure management.
- feat Add sync machine button & correct network address Adds machine sync controls and corrects network address configuration.
- feat Add email templates for notifications and more Adds email templates for notification and communication flows.
- feat Service backend Ensures internal admin calls route via IPv6 address, sets up service backend and public URLs, adds webhook-based telemetry delivery.
- feat Virtual Machine Migration End-to-end VM migration across Atlas control plane and Metal hosts with Ed25519 keys, scoped JWTs, durable migration records, and resumable ZFS copies.
- feat Add the atlas-deployer CLI Adds `atlas-deployer` command with create, start, stop, restart, status, ssh, logs, setup, resize, and destroy operations for managing Atlas VMs.
- feat Install a production Atlas machine from one script Single script installs Pilot, bench, site, atlas app, production nginx, and first guest image on fresh Ubuntu 24.04 without operator interaction.
- feat Complete the desk setup wizard Install now walks the setup wizard without answers and pins time zone to UTC (or configured zone), unblocking subsequent operations.
- feat Serve and migrate bootstrap images without object storage Atlas can publish and boot first VM image as public site Files, then migrate into object storage after credentials are available.
- feat Bind each token to its issuer, scopes, and tenant Tokens now carry issuer namespace, scopes, and tenant in signed claims; callers need no validator changes for new tokens.
- feat Remove support cloud init flag from vm image Removes obsolete cloud-init configuration flag from VM images.
- feat Add integration with cargo. Integrates Atlas with Cargo for coordinated infrastructure operations.
- feat Hide Central surfaces on a self-hosted bench Hide Central-only UI elements and API calls on self-hosted benches without Central integration.
- feat Auto-boostrap pilot in cloud Apply Central credentials during host boot, cut credential-to-serving from 833ms to 110ms, add zero-downtime site rename and admin domain updates.
- feat Add the Atlas sidebar and dashboard feat(desk): Add the Atlas sidebar and dashboard
- feat Copy-paste entire page or blocks Copy and paste entire pages or individual blocks with conflict detection and dependency resolution.
- feat Cargo for production feat: Cargo for production
- feat Add block_administrator app feat: add block_administrator app
- feat Stable REST API Typed REST API system with API docs, tenant ID isolation, and JWKS test server.
- feat Allow ignoring files for validations Configuration option to exclude files from validation checks.
- feat Add the virtual machine sleep policy Virtual machines can now sleep when idle and wake on network packet; policy set via `is_sleepy` and `idle_timeout_seconds` flags.
- feat Frappe-ui: tooltip columns, reference line labels, and chart fixes Adds `tooltipColumns` prop to BarChart, LineChart, and AreaChart for tooltip-only data; adds reference line labels and other chart refinements.
- feat Spaces-first navigation and space identity on frappe-ui beta.55 Navigation now spaces-first with spaces as first-class identity; upgraded frappe-ui from beta.25 to beta.55.
- feat Datum spawning and management Datum instance spawning and lifecycle management.
- feat Local metrics store Local metrics storage capability.
- feat Sleepy VMs + warm snapshot refactor Added sleepy VM support with automatic snapshot-based sleeping, packet-triggered wake-up, and eBPF-tracked network activity.
- feat Use base36 in auto-proxy domains Auto-proxy domains now use base36-encoded tenant and VM IDs instead of decimal suffixes for cleaner URLs.
- feat Add static VM hostname routing Added deterministic VM routing from regional hostnames by deriving IPv6 address from tenant and VM IDs.
- feat Metrics integration Added storage metrics collection with long-term telemetry data and threshold-based event firing.
- feat HTTP Proxy & TLS Management Added automated proxy server spawning, multi-IP DNS for high availability, auto-recovery/bootstrapping, automatic leader selection, and daily password rotation for Frappe Atlas infrastructure.
- feat Drag threads onto a folder to move them Added drag-and-drop to move mail threads onto sidebar folders as an alternative to the "Move to" menu.
- feat Add open-in-new-tab action and Cmd+Enter shortcut Added "Open in new tab" option in the right-click menu and Cmd/Ctrl+Enter keyboard shortcut for Drive files and folders.
- feat Email alerts to configured recipients Added email as a third alert sink, allowing benches to send alerts directly to configured inbox recipients alongside webhooks and Central.
- feat Release machines on demand Added on-demand machine release capability to Frappe Cargo infrastructure.
- feat Inform central on cluster health changes Added cluster health change notifications to Central from Cargo provisioning backend.
- feat Allow addition of storage nodes on the fly feat: Allow addition of storage nodes on the fly
- perf Snapshot a space once per transaction, not per save The space snapshot is now updated once per transaction instead of rebuilt from scratch on every save, eliminating half a million redundant writes when bulk-creating 1,000 pages.
- perf Refactor(atlas-vm)!: Rename the CLI to atlas-vm and write setup in Python CLI renamed from `atlas_deployer.py` to `atlas_vm.py` and installs as `/usr/local/bin/atlas-vm`; replaced `setup.sh` with `setup.py` to eliminate shell parsing of TOML values.
- perf Watch instance metadata instead of a 10 second timer Replace oneshot timer with continuous metadata watcher; cut VM startup from 10–14s to 5–6s.
- perf Make idle shutdown an internal feature Refactored metal layer: faster warm snapshot syncing, separated traffic monitor, switched to clang, abstracted network namespace ops, simplified network monitoring.
- perf Rename the generated API clients Renamed clients from `atlas` / `atlas_http_proxy` to `atlas-client` / `atlas-proxy-client` to avoid package name collision.
- perf Save virtual machine state through the document API Changed VM State rows from grouped `frappe.qb` update to individual `Document.save` calls so document hooks run.
- perf Frappe-ui: finalize the v1 CSS styling-hook contract Freezes public List CSS variables (`--list-columns`, `--list-gap`, `--list-row-padding-x`) and sugar classes before v1 release.
- perf Easier JWKS vs public key distinction Refactored JWKS / public key handling.
- fix Reveal the current page in the editor tree Opening a page in the editor from the reader's Edit link left its parent groups collapsed and the page off screen.
- fix Serve public files of every extension Public files were served off disk only for an extension allowlist; anything else 404ed despite being on disk.
- fix Flush the build machine before snapshotting it A VM booted from a baked Pilot image served 502 on every site because the image contained empty files; flushing the page cache before snapshotting prevents this.
- fix Restore apps submenu content The Apps submenu rendered an unlabeled empty row instead of mounting AppSelector after frappe-ui changed how it handled legacy component menu options.
- fix Find the base image instead of naming it Builds now find the base System image by querying Atlas instead of naming it, fixing the "image does not exist" error on every build.
- fix Wait for the build machine to boot Builds now wait up to 60 seconds for the machine to respond to ping and 180 seconds for sshd before sending the provision script.
- fix Fix the names, the password and the wait in a build Standardizes bench and site names across builds, removes stored site passwords, and adds boot waits to prevent SSH timeouts.
- fix Initialize Pilot images without dev dependencies Passes --no-dev when Pilot initializes the baked image bench to avoid unresolvable dev dependencies.
- fix Reserve bench names that collide with host-wide units Reserves bench names `pilot`, `bench`, and `site` to prevent collisions with host-wide systemd units.
- fix Complete recording publication Accepts recorder upload query parameters, aligns SFU grant lifetime with startup, and sends room owners branded, templated completion emails with Drive artifact links.
- fix Make participant cleanup resilient Centralizes participant cleanup and completes independent cleanup steps even when one removal fails.
- fix Map a public IPv4 for host-originated traffic The public IPv4 map applied only to forwarded traffic; this adds the same map for traffic that a host process starts.
- fix Offer shared pool addresses when provisioning fix(cargo-server): Offer shared pool addresses when provisioning
- fix Misc Retires images safely, reclaims archived Machine images, filters image listings, and allows virtual machines to claim unowned pool addresses.
- fix Install the app after production setup Install hooks enqueued jobs before Redis started; moved install after production setup brings up workload services.
- fix Resolve the Go toolchain path Build failed on hosts without system Go because toolchain path was relative; now resolved to absolute path.
- fix Let a host read a published public file Hosts could not download public Files from the Atlas site; `/files/` added to guest path prefixes.
- fix Update maharashtra women's professional tax exemption to 25000 Bumped ceiling for women's Professional Tax exemption from the prior limit to ₹25,000 inclusive.
- fix Use friendly date format in event and schedule pickers Event and schedule pickers now render user-friendly date format instead of raw strings.
- fix Keep the space logo picker inside the viewport Space Logo picker popover pushed off the top of short windows; repositioned to stay inside viewport bounds.
- fix Keep a page deleted in a draft visible until the merge Pages deleted in draft mode vanished from the editor tree, so authors never published the deletion; now stays visible with a struck-through "Deleted" status.
- fix Spend the sequential ramp from the deep end Single-series bar charts used paler color than first series in stacked chart; ramp now starts from deep end with consistent spacing.
- fix Support mobile video fullscreen and empty tab slots Native WebKit fullscreen on iPhone was blocked; now enters fullscreen when standard Fullscreen API is disabled, with synchronized transitions.
- fix Update README formatting and remove outdated information fix: update README formatting and remove outdated information
- fix Raise the descriptor limit on bench units Raise file descriptor limit to 65535 to prevent request failures after idle restarts.
- fix Apply Central credentials during host boot Apply Central credentials at boot time instead of waiting for first Admin request.
- fix Pass proxy's IP fix(nginx): Pass proxy's IP
- fix Handle out-of-sync Yarn lockfiles during app install Retry app installation with pure-lockfile mode if frozen-lockfile fails due to lockfile drift.
- fix Mark fully discounted order lines as free items fix(shopify): mark fully discounted order lines as free items
- fix Make the iOS home screen icon full-bleed and opaque fix(pwa): make the iOS home screen icon full-bleed and opaque
- fix Frappe-ui: mute the categorical red Chart red was too loud; adjusted tone for better visual hierarchy.
- fix FC-scripts: grep hooks.py for asset includes instead of using bench console Asset include grep rewrite missed a merged PR; switched to direct grep of hooks.py like other hook finders.
- fix Install.sh on Ubuntu 26.04 Installation script compatibility fix for Ubuntu 26.04.
- fix Enforce Node.js 24 requirement in install.sh Script silently skipped Node setup if any version existed; now validates major version and enforces Node 24.
- fix Ecommerce integrations: clear global default warehouse and fix amazon test setup Test suite failures from item creation hitting global default warehouse company mismatch; cleared default and fixed setup.
- fix Frappe-ui: export defineModel props, add ContextMenuEmits, TabButtonsSlots Exported missing type definitions for HoverCard, KeyboardShortcutsDialog, Tree open/expanded props and ContextMenu emits.
- fix Frappe-ui: remove duplicate update:open / update:query emit declarations Combobox and MultiSelect declared emits twice (via defineModel and *Emits interface), causing merged signature to lose type info for consumers.
- fix Only validate route uniqueness when the route changes Merging a change request that only reorders pages no longer fails with duplicate route errors from unrelated existing duplicates.
- fix Stop the editor TOC rail squashing rows on long pages Editor's "On this page" rail now allows flex items to grow, preventing text clipping on pages with many headings.
- fix Tolerate unavailable local storage Local storage write and removal failures are now treated as best-effort so quota or browser availability failures don't interrupt Meet.
- fix Serialize concurrent room creation Concurrent first joins to the same Meet Room now share one in-flight room creation, preserving both admitted peers and avoiding orphaned routers.
- fix Stabilize startup and reconnects Aligned initial camera/microphone setup timing, preserved participant connection identity across reconnects, and fixed media lifecycle.
- fix Register drive domain callback before generating google auth url fix: register drive domain callback before generating google auth url
- fix Preserve VMs across daemon restarts VM PTY master file descriptors are now preserved across metald restarts using systemd's file descriptor store.
- fix Add missing loan permission checks across lending APIs Added permission checks to whitelisted lending APIs that were reading or changing loan data without verifying the caller's access to those records.
- fix Add missing loan permission checks across lending APIs Backport of #1433 to the active branch.
- fix Check the account belongs to the caller before reading it Added ownership checks to `get_mailboxes` and `get_quota` endpoints to prevent unauthorized access to other users' mail accounts.
- fix Keep RichTextKit demo headings out of the page TOC Fixed demo preview headings leaking into "On this page" table of contents on documentation pages.
- fix Every folder reaches the sidebar, not just the first twenty Fixed mail folders beyond 20 disappearing from sidebar, folder settings, and move menus on accounts with many folders.
- fix Saving a Studio Component breaks Fixed Studio Component save failures by serializing the block field before saving.
- fix A PDF attachment draws on iOS Fixed PDF attachments rendering as a black screen on iOS by configuring pdf.js worker and fixing the viewer initialization.
- fix Save slides by client_id with conflict detection Fixed presentation slides being wiped when two editors had the same deck open by tracking slides with client IDs and adding conflict detection.
- fix Ensure metadata bucket creation Fixed metadata bucket creation to be idempotent when the bucket already exists.
- fix Use region from provisioning backends Passed region parameter during backend selection for regional services.
- fix Add as on date filter to Loan Outstanding Report Adds historical date filtering and fixes incorrect calculations from mixing today's values with past-date queries.
- fix Update parent doc link field when nested Quick Edit Form Fixes newly-created linked records from nested Quick Edit Forms not being linked back to the parent document.
- fix Handle empty cell values in JSON and CSV exports when hide group value selected Respects "Hide Group Amounts" filter in CSV and JSON exports, preventing raw group values from appearing in exports.
- fix PDF and video embeds break on filenames with spaces and parens Fixes regex in pdf-block.js and video-block.js that incorrectly truncated URLs containing parentheses and spaces.
- refactor Name every host-wide unit pilot-*, reserve only that name Consolidates host-wide user units under a single `pilot-*` prefix instead of three separate prefixes, eliminating fixture naming conflicts.
- refactor Simplify SFU tooling and persistence Replaces yargs with Node's built-in argument parser, uses structured cloning for isolated persistence snapshots, and removes obsolete dependencies.
- refactor Authorize consumer mutations internally Moves consumer ownership checks into the SFU mutation boundary and simplifies socket handlers to pass authenticated room and peer identity.
- refactor Centralize local publication outcomes Makes local media publication reconcile requested tracks before reporting success and returns explicit, independent audio and video outcomes.
- refactor Simplify E2EE media plumbing Centralizes E2EE epoch envelopes, uses native abort checks across media lifecycle, and removes unused media facade methods.
- refactor Simplify frontend state Replaces verbose setup-style Meet stores with concise option stores, removes unused state, and consolidates responsive-grid and notification logic.
- refactor Consolidate SFU peer ownership Makes room peer maps the sole owner of peer metadata and consolidates transports, producers, and consumers in their authoritative media modules.
- refactor Add explicit timeout & queue for setup refactor: Add explicit timeout & queue for setup
- refactor Bump frappe and erpnext versions chore: bump frappe and erpnext versions
- refactor Migrate to the frappe-ui v1 API (beta.63) Migrate to frappe-ui v1 API; rename Rail/RailItem to SidebarRail/SidebarRailItem, remove list-cols breakpoints and FormLabel.size.
- refactor Credit the Go anti-pattern source docs(llm): Credit the Go anti-pattern source
- refactor Unify agent instructions and add Go review guide docs(agent-guides): Unify agent instructions and add Go review guide
- refactor Sync with upstream pypika v0.51.1 chore: sync with upstream pypika v0.51.1
- refactor Exclude non-app paths from bench validation Bench app validation now ignores `scripts/`, `clients/`, `services/`, `metal/` and keeps `atlas/vm/scripts/` ignored for cloud-init.
- refactor Add supported frappe version Added framework version support declaration for pilot-based development.
- refactor Ignore validation for scripts and version cap Validation exclusions for scripts and version requirements.
- refactor Ensure metrics pull over http instead of ssh Metrics communication protocol update; awaiting atlas firewall for node port exposure.
- refactor Ask central for metrics token refactor: Ask central for metrics token
- refactor Remove unused code and make Knip pass Removed unused code, duplicate exports, unnecessary public declarations, and corrected Knip workspace coverage.
- refactor Remove unused APIs and simplify background state Removed unused media and E2EE APIs, write-only SFU key-package bookkeeping, and simplified background state storage.
- refactor Bump frappe-ui to 1.0.0-beta.61 for mention prefixes Bumped frappe-ui to include mention prefix fix so `@user` works after opening brackets and quotes.
- refactor Use mergify for backports instead of backport action Switched backport automation from the deprecated backport action to Mergify.
- refactor Merge develop into main Merge develop into main
- refactor Remove dead calls, restructure & rename files Cleaned up dead code and restructured Cargo module organization.
- refactor Adapt to cargo terraform layout Adapted Central backend selection to the new Cargo Terraform layout.
- refactor Restructure folders and documentation Restructures Atlas and Metal around explicit ownership with split provider responsibilities and reorganized packages and tests.