Weekly report
Frappe and ERPNext changes, 10 Aug to 16 Aug 2026
565 changes merged: 8 breaking, 165 new features, 53 speed-ups, 272 fixes, 67 refactors.
Breaking changes
Read these before you update. They can change how your site or app works.
- breaking Preserve POST authorization through login Guest POST to authorization endpoint lost body parameters (`client_id`, `redirect_uri`, `state`) before resuming, breaking the OAuth flow.
- breaking Synchronize camera media lifecycle Camera media ownership changes during device switches and unmounts were not synchronized, breaking recovery and E2EE republish.
- breaking Report the number of blocks changed, not a replacement count Replacement count incremented once per block regardless of matches inside, breaking both UI reporting and translation strings expecting two separate values.
- breaking Qty and UOM not fetched when adding Item in Material Request Python 3.14's lazy annotations were overriding type validation, breaking item detail fetching in Material Request.
- breaking Update no copy for attendance request in attendance Duplicating Attendance created outside `save_report` copied the read-only attendance_request link, breaking subsequent saves; now marked no-copy.
- breaking Use the passed-in user for team permission checks Permission checks in `_agent_has_permission()` were using session user instead of the passed-in user, breaking Permission Inspector and delegated queries.
- breaking Take charts v2 to the 1.0.0 bar Charts v2 cleaned up for v1.0.0 stability; breaking changes documented in migration guide.
- breaking Rename Italy's duplicate Customer name fields Italy regional setup created custom first_name/last_name fields colliding with standard quick-entry fields added in #46281, breaking all subsequent custom fields on Customer.
- breaking Preserve POST authorization through login Guest POST to authorization endpoint lost body parameters (`client_id`, `redirect_uri`, `state`) before resuming, breaking the OAuth flow.
- feat `after_app_build` hook to hook into another app's build process New hook allows apps to inject build steps when another app is built, enabling Studio to build app-specific frontends during app installation.
- feat A per-render tab override, and announce the resolved tab FormLayout tabs now support per-render `hidden` and `label` overrides that apply after `depends_on` resolution, and announce which tab is active to callers.
- feat Dispatch field commits at the mutation site FormLayout now emits field `change` events at mutation, allowing consumers to react to field edits without deep-watching documents.
- feat Rebuild address & contact cards and add quick entry Address and Contact cards rebuilt with espresso components; quick entry now enabled for both doctypes on party forms.
See all 67 changes
- feat Allow scheduled jobs to override their worker queue Cron jobs can now specify custom queue and timeout, removing workaround of enqueuing secondary jobs for longer-running tasks.
- feat Typst pdf renderer Replaces Chromium PDF rendering with Typst for 15x faster print generation (1.5s → 90ms), consuming 300MB less memory.
- feat Show_search option for EmbeddedList `EmbeddedList` now accepts `show_search` option to hide the search input for fixed-row lists.
- feat Added setup key support in 2fa login Two-factor authentication can now use either QR code scan or manual setup key entry for authenticator apps.
- feat Add user/doctype filtering to `User Doctype Permissions` report New filters let you drill into one user or one doctype instead of viewing the full matrix.
- feat Prettier email templates Email templates for registration, password reset, and login redesigned for clarity and visual polish.
- feat Let apps supply their own inline SVG icons Apps can now register custom inline SVG icons via a `Custom Icon` doctype.
- feat Show edits, milestones and shares in the activity timeline Activity timeline now surfaces edits (for doctypes with no version history), milestone records, and share events.
- perf One choke point for the FormLayout field pipeline Centralized field property override point in FormLayout ensures per-render property changes stick across keystroke re-evaluation.
- perf Add cy.desk_ready() to replace blind desk-load waits Adds cy.desk_ready() helper that waits for desk to boot, requests to settle, and content to render instead of fixed sleeps.
- perf Use desk_ready() for file_uploader desk-load waits Converts file_uploader tests to use cy.desk_ready(), cutting test time from 58s to 33s by eliminating overshot waits.
- perf Remove unused JS coverage instrumentation from UI tests Removes JS coverage instrumentation that was computed but never uploaded, saving time per UI test run.
- perf Fix/attendance calendar sorting Preserves list view sorting in calendar view; displays single-boundary datetime events at known time; includes single-day events.
- perf Reuse cached web form doc when building link options Web form doc is now cached when building link options.
- perf Reuse cached web form doc when building link options `get_link_options` and `process_link_field` were both reloading the same Web Form document; switched to `get_cached_doc`. On a 25-link form, query count drops from 105 to 30 (warm cache).
- perf Let useDoctypeMeta follow a reactive doctype Composable now properly memoises against reactive doctype values instead of forcing callers to recreate on each change.
- perf Force type check in whitelisted methods Added type hints and runtime type checks to whitelisted methods across automation, contacts, custom, search, www modules.
- fix Authenticate UserInfo bearer tokens UserInfo endpoint required Frappe login before OAuth bearer authentication ran, allowing valid tokens to bypass auth. Tokens for missing or disabled User records remained valid, violating RFC 6749.
- fix Record the source document a notification came from Mentions in comments only recorded the parent document, not the comment itself, forcing users to search through dozens of comments to find the mention.
- fix Report view status column corrupts link title fetch on doctypes without an indicator Status column built unconditionally then removed mid-render, shifting all subsequent cells onto wrong columns and fetching titles for wrong doctypes.
- fix Identify tabs by name, not by position Tab selection by index broke when `depends_on` tabs appeared or disappeared, silently moving the reader to a neighboring tab without preserving which tab they were on.
- fix Typed empties for a new child row, and a write-through row-edit dialog New child rows omitted fields without defaults, making `undefined * undefined` computations fail silently; dialog edits also didn't persist to parent form.
- fix Name the Page Script save event by its current spelling Comment updated to reference `beforeSave` instead of deprecated `before_save` handler key.
- fix Enforce IP restrictions for header-based authentication IP allowlist validation now runs for all authentication paths, covering header-based auth that previously bypassed the check.
- fix Consider document ownership in ToDo permission hooks Permission checks now properly account for ToDo ownership, preventing unauthorized access to other users' tasks.
- fix Add permission check to assignment rule apply Assignment rule apply method now validates caller permissions before executing rule assignments.
- fix Apply permission checks to kanban board methods Board read permission now enforced across all kanban board API methods.
- fix Fall back to docname when link title lookup target is missing Report view no longer redirects when a Link column references a deleted document; displays the docname as fallback.
- fix Pick RTL layout for supported languages RTL-supporting languages now detected from framework language definitions and layout switched accordingly.
- fix Honour ignore_user_permissions on link fields with a custom query Custom queries were ignoring the `ignore_user_permissions` flag, allowing queries to inadvertently apply user permissions even when they should be bypassed.
- fix Untranslated awesomplete status messages Awesomplete status messages ("N results found") were hardcoded in English; now route through translation via a subclass.
- fix Untranslated quill table picker labels Quill's table picker labels were hardcoded CSS, ignoring user language and custom translations; now render from translatable attributes.
- fix Limit concurrent PDF generation requests Caps concurrent PDF renders to prevent resource exhaustion under load.
- fix Consistent link style in toast message Links in toast messages now use consistent styling instead of being overridden by global CSS.
- fix Validate HTTP method for document calls Validates that whitelisted document methods are called with the correct HTTP method.
- fix Handle missing json when updating a custom report Custom reports created outside `save_report` had no `json` value, causing crashes when updating columns.
- fix Show column indicator as colored dot, not column background Kanban column indicator was tinting the entire column instead of appearing as a small dot in the header.
- fix Update modified timestamp when Workflow Action is completed Workflow action completion now updates the document's modified timestamp.
- fix Apply export field access Export now applies field-level access control to child tables.
- fix Restore Global Search shortcut (⌘G / Ctrl+G) Desktop Icons page was overriding the global search shortcut without page scope; now page-scoped.
- fix Send workflow email when a document re-enters an approval state Workflow Action dedup check ignored status, so every return to a state was treated as already handled — no new action, no email.
- fix Migrate remaining v1 colour tokens to the v2 token set Tailwind color utilities (`surface-white`, `outline-gray-modals`) were retired but still used, silently rendering as nothing.
- fix Make headless_shell executable on linux arm64 On linux arm64, `bench setup-chrome` left `chromium/headless_shell` at mode 0644, causing 300s timeout as Chromium could not start.
- fix Index creation and modified columns like MariaDB PostgreSQL was not indexing `creation` and `modified` columns, causing list view sorts to scan every row.
- fix Index parent column on child tables Child table `parent` column was not indexed on PostgreSQL, causing sequential scans on child-row loads and subqueries.
- fix Handle None values in PortalSettings menu fields TypeError when a PortalSettings menu field had a None value; now safely coalesces with helper method.
- fix Treeview collapse all expand all fix: treeview collapse all expand all
- fix Resolve currency precision from the currency's number format Currency Precision was always read from global number format, ignoring currencies with custom decimal places (BHD, OMR, AED).
- fix Sync support for translated_doctypes in search_widget custom queries Backports translated-doctype support from develop to v15.
- fix Add permission check in create_email_flag_queue Missing permission validation allowed unauthorized email flag creation.
- fix Return plain dicts and echo doc after execute_doc_method in API v2 API v2 responses were missing information available on newer versions; now returns complete payloads on both old and new versions.
- fix Stop a leading template comment from dropping the caller's class Production builds silently dropped caller-supplied `class` attributes when components had a comment as the first node.
- fix Keep a document's realtime room alive while another consumer holds it First consumer to unsubscribe from a document evicted all other watchers; now refcounts to keep the room open.
- fix Hide core modules in global search settings Core module doctypes appeared in the global search dropdown even though global search isn't supported for them.
- fix Chrome pdf reliability and geometry issues Chromium connection drops now fail in-flight commands instead of hanging; custom page size stored in mm was consumed as px (3.78× too small); header-spacing string crashed.
- refactor Redesign notification panel UI Notification panel UI redesigned for improved visuals.
- refactor Vouch alyf-de team chore: vouch alyf-de team
- refactor Update pypdf chore: update pypdf
- refactor Release v16 Automated weekly release.
- refactor Release v15 Automated weekly release.
- refactor Drop cryptography and pyOpenSSL from exclude-newer-package Scheduled merge after 2026-08-08 when releases are older than 7 days.
- refactor Bump postcss from 8.5.18 to 8.5.23 Security update for PostCSS.
- breaking Qty and UOM not fetched when adding Item in Material Request Python 3.14's lazy annotations were overriding type validation, breaking item detail fetching in Material Request.
- breaking Rename Italy's duplicate Customer name fields Italy regional setup created custom first_name/last_name fields colliding with standard quick-entry fields added in #46281, breaking all subsequent custom fields on Customer.
- feat Validate purchase receipt exchange rate parity on purchase invoice Foreign currency invoices at different rates silently booked exchange differences to the wrong account; now validated at submission.
- feat Belgian Charts of Accounts (commercial + non-profit, FR + NL) Replaces placeholder chart with four validated PCMN charts from Belgian legislator, covering commercial and non-profit entities in French and Dutch.
- feat Opt-in 'Consider Accounting Dimension' filter on General Ledger Report Accounts Settings now has toggle to disable "Consider Accounting Dimension" filter on General Ledger Report, restructuring Reports tab into sections.
See all 93 changes
- feat Cross-plan load and overlap validation in production plan scheduling Production plan scheduler now loads other plans' booked capacity and validates no overlap, preventing concurrent plan slot double-booking.
- feat Add shipping contact person to sales order, delivery note and sales invoice Shipping contact can now be selected separately from billing contact in selling documents.
- feat Sync serial no status from stock ledger in Stock Qty vs Serial No Count report Report now syncs orphaned serial numbers and corrects their warehouse/status from ledger, fixing drift caused by cancelled/amended vouchers.
- feat Capacity aware scheduling for production plan Production plans now compute realistic item-wise start/end dates via finite-capacity scheduling before work orders are created.
- feat Add Bank Charges account for Payment Entry deductions New optional Bank Charges Account on Company; when a Payment Entry has a paid/received difference (e.g., bank fee), it now books to Bank Charges instead of always Exchange Gain/Loss.
- feat Multi select item and warehouse filters in warehouse wise item balance Item and warehouse filters now accept multiple values (MultiSelectList); compare several warehouses without re-running the report per warehouse.
- perf Hide primary address and contact preview fields Address & Contact cards now show all details; read-only preview fields below removed to avoid duplication.
- perf Filter stock projected qty bins by company in SQL Report performance improved: warehouse company lookup cache was never actually used; now filtered in SQL to eliminate per-row queries.
- perf Reorder sales invoice mapper arguments `make_sales_invoice` now takes `args` before `ignore_permissions` for cleaner positional calling.
- perf Batch per-row bin lookups in sales invoice and delivery note Sales Invoice with Update Stock now fetches stock in one query per warehouse instead of one per row; also batched per-batch expiry lookup.
- perf Rewrite customer and supplier naming setters only on change Update Customer/Supplier naming metadata only when `cust_master_name` / `supp_master_name` changes, avoiding redundant cache clears and backfill UPDATEs.
- perf Reduce repeated setup work Update Item naming and barcode metadata only on change; run Sales Partner reports against one fixture per DocType; skip stock receipts for non-stock doctypes.
- perf Rewrite selling settings toggle setters only on change Rewrite tax_id, bundle-rate, and discount-account Property Setters only when their driving setting changes, not on every Selling Settings save.
- perf Using frappe.get_query in get_filtered_child_rows Refactored to use framework's query builder instead of raw SQL.
- fix Added permission check for `get_msg_html` Missing permission check allowed unprivileged users to access digest HTML generation.
- fix Correct is_frozen description on customer and supplier Descriptions now accurately state the flag blocks all new transactions, not just ledger entries.
- fix Restore subcontracting inward warehouse validation Warehouse direction handlers now route all four subcontracting inward purposes and restore required warehouse checks that were removed during service refactoring.
- fix Honor pick serial/batch based on setting in batch selector Add Batch Nos dialog now respects Stock Settings instead of hardcoding FIFO, allowing expiry-based batch selection when configured.
- fix Ignore historical negative batch stock in outward validation Outward stock entries no longer blocked by negative periods from years ago that have since recovered; only current balance matters.
- fix Disallow reversing a reverse journal entry Prevent double-posting of gain/loss entries by blocking reversal of already-reversed Exchange Rate Revaluation journal entries.
- fix Allow purchase returns against closed purchase orders Purchase returns can now be created against closed POs, removing an overly restrictive validation.
- fix Validation for task end date check Task end date validation now enforces proper date ordering.
- fix Fix AttributeError on budget validation Budget validation error message formatting now handles v15 doctype structure, showing clear validation message instead of crashing.
- fix Filter parties by transaction company Customer and Supplier selectors now respect company restrictions, matching Item selector behavior.
- fix Get items from sales order in sales invoice Sales invoice item fetch now correctly retrieves items from linked sales order.
- fix Preserve alternative material attribution Manufacturing now correctly tracks when items satisfy both their own and alternative requirement roles, preventing attribution loss.
- fix Rename misspelled delink_refernce_from_voucher Internal method spelling corrected from "refernce" to "reference" for naming consistency.
- fix Rewriting overdue billing checkbox description Overdue billing field description clarified.
- fix Create `crm_deal` fields on enabling frappe crm data synchronization Creates necessary CRM data synchronization fields on Customer and Quotation when the feature is enabled, with cleanup if disabled.
- fix Confirm before changing item qty from the batch selector The batch selector was silently overwriting item quantities in Delivery Notes, turning a manually-edited batch row into an unintended total.
- fix Allow purchase returns against a closed purchase order Closing a purchase order was blocking returns for its remaining items even when receipts existed against them.
- fix Keep Currency and Price List section open for foreign currency The Currency and Price List section now starts expanded when transaction currency differs from company currency, since the exchange rate becomes relevant.
- fix Delivery note billing based on quantity Delivery notes now compute billing status on quantity basis in addition to amount basis, fixing cases where rate changes left items permanently "Partially Billed".
- fix Derive material transfers from actual coverage Stock entry transfers are now capped to the quantity actually covered by included raw materials, preventing overclaims.
- fix Describe stale exchange rate settings Improves error messaging when exchange rate settings are out of date.
- fix Apply Sales Person user permissions in Accounts Receivable Clearing the Sales Person filter no longer bypasses user permissions for sales persons.
- fix Split fifo/lifo rate across grouped stock item rows Asset valuations with items at multiple rates now apply FIFO/LIFO correctly per row.
- fix Item description in the item price list Item Description field in Item Price now displays as formatted text instead of raw HTML.
- fix Filter available batch report by company Available Batch Report now applies the selected company filter to both standard and serial/batch bundle entries.
- fix Exclude corrective transfers from item-level transferred qty Corrective job card transfers were inflating per-item transferred quantities and understating pending demand; now excluded from rollup.
- fix Don't count corrective job card transfers as transferred qty Corrective transfers were inflating material_transferred_for_manufacturing; now excluded from work order rollup.
- fix Refine corrective job cards Corrective job cards now require both operation fields, use Create for correct label, hide inapplicable fields, and block for semi-finished goods.
- fix Show full date range in MRP chart MRP chart stopped after 10 dates and checked wrong field for past dates; now shows full range and uses correct delivery_date field.
- fix Require material transfer before job card start and completion Job cards accepted Start/Complete before Material Transfer for Manufacture existed; added validation gate to both actions.
- fix Correct nested BOM Explorer quantities BOM Explorer reset accumulated quantity at each nested level, giving wrong component quantities; now carries multiplier through the tree and normalizes child UOMs.
- fix Bill re-delivered sales order quantities Sales Invoice used zero quantity after a full return/re-delivery cycle because `returned_qty` and `delivered_qty` were not combined correctly.
- fix Keep item code searchable when a barcode matches the same text Item lookup overwrote the `name LIKE` filter with barcode condition in a dict, making item codes disappear when they overlapped a barcode.
- fix Distribute PO-invoice billed amount across receipts without duplication PO-level invoice amounts were reused across multiple Purchase Receipts during FIFO allocation, overstating billed amounts and marking receipts Completed too early.
- fix Keep PO billed qty in sync when allocating amount to receipts Amount-capped branch reduced remaining billed amount but not qty, causing later receipts to under-bill because they divided by stale qty.
- fix Read overdue amount from payment ledger, not gl tags With Restrict Customer Over Billing enabled, customers with advance payments allocated after invoice submit were wrongly blocked; now reads from Payment Ledger instead of stale GL tags.
- fix Reset stale item details on item change Changing an item on a Sales Order reused values from the previously selected item (UOM, conversion factor, weight, barcode); now clears them before server fetch.
- fix Mirror rounding adjustment on distributed_discount_amount Rounding adjustment was added to both `net_amount` and `distributed_discount_amount` (which are linked by subtraction), double-counting the discount share.
- fix Fetch driver address by supplier link Driver form looked up transporter Address by title, failing when Supplier naming series made the Supplier ID differ from Address title; now uses Dynamic Link.
- fix Reinstate operations completed check for manufacture entries Manufacture entries could submit against work orders whose operations were never completed, bypassing the existing guard.
- fix Validate warehouse accounts when used Warehouse accounts were validated at build time instead of at use time, leaving incomplete configurations in drafts that would fail on submit.
- fix Reinstate duplicate entry check for manufacture entries Multiple Manufacture entries against the same work order could submit when qty was already fully covered.
- fix Preserve original operation idx in manually created Job Cards Create Job Card dialog used dialog row idx instead of Work Order Operation idx, pulling raw materials from the wrong operation.
- fix Reinstate mandatory manufactured qty check for manufacture entries Manufacture entries could submit with For Quantity 0, leaving work order progress unupdated.
- fix Preserve BOM Creator item details BOM Creator item selection suppressed the inherited server method, losing item details, rates, and UOM values.
- fix Set auto reserve stock flag before packing list generation With `auto_reserve_stock` enabled, packed items on new Sales Orders were not marked for reserve because the flag was set after packing.
- fix Pass finished goods as list to subcontracting BOM lookup Function received a `set` but only handled `str` and `list`, causing SQL query failure outside request/test contexts.
- fix Allow non-admin roles to import chart of accounts Permission check referenced non-existent DocType "Party Account", blocking all non-admin COA imports with "Insufficient Permission".
- fix Item property updates in POS and transactions and add styling Batch and Serial Number selection fields disappeared from POS Item Details after the item was added to cart.
- fix Correct totals and labels in section foo… Cash flow report section totals and labels were incorrect; now match P&L and Balance Sheet filter display.
- fix Block disabled/frozen party on Opportunity and Request for Quotation Disabled/frozen Customer could be saved as Opportunity party, only getting caught later at Quotation stage.
- fix Repair existing underbilled purchase receipts New idempotent patch recomputes every candidate PO item from receipts with mixed billing; earlier patch only caught over-billed items.
- fix Field validation and permission checks on get_stock_reservation_entries_for_voucher Added missing validation and permission checks on a stock query endpoint.
- fix Preserve custom title on new JV Journal Voucher custom title was being cleared on creation.
- fix Re-check future SLE before queuing repost on submit Concurrent stock entries could skip repost checks because the decision was cached before writes completed.
- fix Skip incoming rate calc when serial no qty is zero Repost of serial+batch items threw ZeroDivisionError when Stock Reconciliation qty recomputed to zero.
- fix Keep asset repair downtime in sync with entered dates Asset repair downtime only updated when status changed, not when dates were edited, leaving stale values.
- fix Clear deferred revenue/expense fields on uncheck Unchecking deferral left old values in the fields.
- fix Track semi finished goods production flow BOM operations require FG/Semi FG items; adds validation, prevents duplicate item rows, and enforces the chain.
- fix Sync open reference forms after Quality Inspection submit QI updates references via raw db writes without emitting realtime events, leaving open forms stale. Now calls notify_update so browsers stay in sync.
- fix Handling negative grand total Sales Orders and Purchase Orders now allow negative totals when the negative-rate setting is enabled; validates rate and keeps quantities non-negative.
- fix Escape `customer_details` on lead creation from appointment Unescaped customer_details field on appointment-to-lead creation could inject script.
- fix Reflect in-invoice receivable credits in Sales Register ledger view Ledger did not reflect in-invoice receivable credit entries.
- fix Tolerate floating-point drift in sales team allocated percentage Sales team allocations rejected valid allocations whose sum drifted due to float precision.
- fix Negate stock value difference for outward transfer bundles Outward stock value multiplied by itself instead of by −1; silently wrong until recalculation from qty.
- fix Validate webform for project Web form permission validation now includes project context.
- refactor Split make_depreciation_entry into public and internal helpers Separates public whitelisted method from internal helper to reduce code duplication between scheduler and disposal flows.
- refactor Use EmbeddedList for item prices Replaces hand-rolled item pricing table with frappe.ui.EmbeddedList for consistency and maintainability.
- refactor Drop redundant time_in_mins assignment in workstation complete_job `complete_job` computed `time_in_mins` with wrong conversion (÷60 instead of ×60), but the wrong value never persisted because job card validation recomputed it; dropped the redundant assignment.
- refactor Stock write-path cleanups (SLE/Bin chokepoint groundwork) Zero-qty rows in `make_sl_entries` reused the previous entry; removed dead logic and clarified intent for upcoming consolidation.
- refactor Release v15 Automated weekly release.
- refactor Release v16 Automated weekly release.
- refactor Disable mergifyio queue comment chore: disable mergifyio queue comment
- refactor Update deps in banking app Update deps in banking app
- breaking Update no copy for attendance request in attendance Duplicating Attendance created outside `save_report` copied the read-only attendance_request link, breaking subsequent saves; now marked no-copy.
- feat Add status filter in Monthly Attendance Sheet Report now filters by employee status (Active, Inactive, Suspended, Left) with Active as default.
- feat Quick action menu for assigning important masters to employee Employee form now has "Create Assignments" menu with shortcuts to Holiday List, Leave Policy, Salary Structure, Shift and Shift Schedule.
- feat Quick check in/out button on employee checkin doctype Shows a quick check-in/out button on Employee Checkin list for the session employee, with optional geolocation confirmation.
- feat Add button to close/reopen job opening Job opening status can now be changed via action buttons instead of manual form field edits.
See all 12 changes
- fix Resolve employee leave balance report error Report no longer crashes when employee filter is blank; defaults to logged-in user where applicable.
- fix Incorrect present/absent/leave count for half-day attendance in summarized view Half-day "other half" status was ignored, and auto-marked half-days were wrongly counted as leave instead of present.
- fix Postgres compatible queries HR and Payroll queries now work with Postgres.
- fix Add non-negative validation for numeric fields HR and Payroll numeric fields (Base salary, Standard Working Hours) now reject negative values.
- fix Remove duplicate links Payroll workspace had 37 unique links and charts shown twice each; deduplicated.
- fix Correct workspace sidebar icons fix: correct workspace sidebar icons
- refactor Improve telemetry events Telemetry event tracking refinements.
- feat Author field conditional logic in the builder + clear embedded form in place Web Form authors can now set Visible if / Mandatory if / Read-only if per field in the builder, evaluated live on the public page (framework-style, not DocType-based).
- feat Add Edit option to Notes three-dot menu feat: add Edit option to Notes three-dot menu
- fix Prevent negative values in currency fields Lead, Deal, and Organization currency fields now reject negative values via framework validation.
- fix Only notify mentions on CRM documents CRM comment hook no longer errors on non-CRM documents like Helpdesk tickets; scope now restricted to CRM doctype references.
- fix Authorize arbitrary notification creation Adds authorization checks to prevent arbitrary notification creation.
See all 13 changes
- fix Range filter not working in dashboard `DateRangePicker` emits `[from, to]` but dashboard expected comma-separated string; now parses both formats.
- fix Render Phone field in its own layout branch Phone field now uses its own layout branch instead of overloading the default one.
- fix Stop logging the author out when previewing a Link-field form Author was logged out by guest-context Link field option lookup during preview, triggering auth failure on all subsequent requests.
- fix Add phone validation to from/to number fields in CRM call log CRM call log lacked phone number validation, allowing invalid input.
- refactor Replace read-only texteditor with sanitizeHTML Replaces read-only TextEditor instances with sanitizeHTML() + v-html for performance and security.
- refactor Patch Release v1.81.2 Patch release for CRM.
- refactor Update Vite to v8 Migrates to Vite 8; safelist reduces production CSS from 6.43 MB to 673 KB, cutting network transfer and browser memory.
- refactor Add crm notification tests Adds notification tests (temporary, pending #2241 migration).
- feat Forms become pages, lists become cards, filters move into a sheet, and settings leaves the phone LMS mobile redesign: create/edit forms are now full-page routes, filters collapse into a sheet, and lists render as cards.
- fix Sanitize what renders and what saves, allowlist bound URL schemes, and pair every permission gate Replaces v-html with v-safe-html (DOMPurify) to prevent XSS attacks from user-generated content like course descriptions.
b
Builder
1 breaking · 6 new features · 3 fixes · 4 refactors
- breaking Report the number of blocks changed, not a replacement count Replacement count incremented once per block regardless of matches inside, breaking both UI reporting and translation strings expecting two separate values.
- feat Site-aware Bob with on-demand orientation, reference reads, and online research Bob AI agent now reads the actual site and reference pages instead of guessing, performs online research, and understands site identity and structure.
- feat Bob - AI Assistant for Builder AI assistant Bob now builds pages from single prompts and iteratively edits them, designing tokens, scripts, DocTypes and form wiring in one conversation loop.
- feat Wrap user-facing strings across the editor Wraps labels, tooltips, placeholders, and messages with translation functions, expanding the catalog from 163 to 337 entries.
- feat Add dev-setup script for submodule init Adds a yarn dev-setup script that initializes the frappe-ui submodule and installs dependencies in one step.
See all 14 changes
- feat Sync `builder_files` with page/script delete and rename operations Page/script deletes and renames now sync to `builder_files` on disk; orphaned directories no longer accumulate.
- feat Preview each font in its own typeface Font dropdown now renders each font name in its own typeface for preview.
- fix Describe embedded components fully in reference reads Shared headers, sidebars, and footers now described fully in reference pages, preventing Bob from rebuilding them from guesswork.
- fix Render repeater with empty data key as plain container Empty repeater key compiled to invalid Jinja syntax; now renders as plain container.
- fix Keep bubble menu open while color picker popover is active Color picker teleported outside the menu, causing the menu to close when opened.
- refactor Wrap remaining user-facing strings for i18n Dashboard, editor shell, command palette and viewer strings now i18n-wrapped for multi-language support.
- refactor Clear open Dependabot alerts Resolves 88 open Dependabot alerts (1 critical, ~40 high) across build dependencies and dev toolchain.
- refactor Make the editor UI extendible Six editor surfaces now read from registries instead of hard-coded arrays; enables third-party registration without Builder knowing about them.
- refactor Sync translations from crowdin chore: sync translations from crowdin
- breaking Use the passed-in user for team permission checks Permission checks in `_agent_has_permission()` were using session user instead of the passed-in user, breaking Permission Inspector and delegated queries.
- feat Actions in saved replies Saved replies can now bundle follow-up actions (status, priority, team, tags) that execute automatically on each use, eliminating repetitive manual steps.
- feat Ticket analytics tab New Analytics tab shows SLA adherence (deadline vs actual), where time went (by message), and issue tracking with visual deadlines.
- fix Hide bulk reply, assign and edit from customer roles Agent-only bulk actions are no longer shown to customers on the ticket list, and the Delete action's condition is now evaluated.
- fix Don't check update perms without a previous version Creating a ticket from customer portal failed with `AttributeError: 'NoneType' object` when checking update permissions on a new document.
- feat Alerts via web hooks Alerts can now POST a JSON payload to a user-configured URL with Bearer token auth; restricted to publicly routable addresses (https only, checked at socket open, no redirects/proxies).
- fix Stop the weekly cleanup from dropping tables it cannot rebuild Orphan warehouse table cleanup now preserves tables it can rebuild and reports instead of silently dropping them.
- refactor Merge `version-3-hotfix` into `version-3` Branch merge.
p
Payments
1 new features
p
Press
7 new features · 2 speed-ups · 23 fixes · 2 refactors
- feat Give user an option to reactivate suspended account Suspended users now see an account status dialog and can choose to reactivate, instead of silent auto-reactivation.
- feat Add backup audit trail to site backups tab Site backups tab now shows downloadable audit trail for past backups, querying server job logs when local records deleted by grandfather-father-son policy.
- feat Add a button to copy the SSH command Adds a button to copy the SSH command for server access, including both the Press gateway and cluster proxy hops.
- feat Agent-update: Handle play failures and let servers opt out Catches Ansible play failures and sets server status to Failure; allows servers to opt out of agent updates.
- feat Add database audit logging Enables MariaDB audit plugin from server actions; logs rotate every 2 hours, upload to S3, and are listed/downloaded via dashboard.
See all 34 changes
- feat Cancel button for long running jobs on the dashboard Long-running jobs (restore, backup, new-from-backup) can now be cancelled from the dashboard; each leaves behind expected state (site Broken, etc.).
- feat Deploy Wazuh Wazuh security monitoring now deployable to servers.
- perf Stop polling and stop holding worker for backup build Backup build no longer sleeps worker or polls page; job callback drops built trail when answer arrives, subscriber model replaces polling.
- perf Insert for selective doctypes Optimized database inserts for specific doctypes.
- fix Only block large-database updates on AWS servers Large database size check for physical backup eligibility now runs only on AWS, allowing updates on OCI and Hetzner.
- fix Show site list for private benches only Benches sites tab no longer displays the massive public bench site list, reducing UI clutter.
- fix Stop remote builds on stop deploy Stopping a deploy now cancels remote builds and fixes dockerfile syntax.
- fix Allow updates if other app versions changed Deployment no longer blocks when other app versions changed, preventing cascading failures.
- fix Ensure trusted apps are added implicitly Trusted apps are now added implicitly to Press.
- fix Fix the audit transition jobs racing the row Audit trail enabling no longer races against concurrent row writes; in-memory copy is now refreshed before each step.
- fix Consider country list present in press when trying to setup account Signup country list now uses Press data.
- fix Name the currency in the audit log price Audit log storage price now displays as `2 INR` / `0.025 USD` instead of bare symbols.
- fix Fix(dashboard) : Filter null value from migration choices fix(dashboard) : Filter null value from migration choices
- fix Calculate flat discount on top of item discount fix(invoice): Calculate flat discount on top of item discount
- fix Spell out how to fix a blocked retry Will-fail messages gave the problem name but not the fix; now include what failed, what's unchanged, the action to take, and the escape hatch.
- fix Skip Frappe version check when a branch declares none Adding or re-pointing the frappe app crashed when validating version against a branch that declared none.
- fix Reduce alert frequency to once a month fix(2fa): Reduce alert frequency to once a month
- fix Turn server tokens off Nginx server tokens exposed version information. Disabled to reduce attack surface.
- fix Make site update recovery resilient and recoverable Failed site updates could end `Fatal` with no path back; recovery now handles timeouts, re-runs idempotently, and provides usable error messages on disk space issues.
- fix Validate bench during agent job Added bench validation before running agent jobs.
- fix Validate address before server creation Missing address validation caused downstream errors during server provisioning.
- fix Clean chart parameters Chart params contained stale values after page transitions.
- fix Verify application patches Added patch verification to prevent invalid patches from being applied.
- fix Account for unified servers in restore space pre-check Migration pre-check didn't account for servers where app and database share a private IP, giving false "no space" errors.
- fix Only update app server for unified servers Team changes on unified servers incorrectly created new subscriptions due to missing validation.
- fix Tolerate a missing unit Wazuh deployment failed if a unit was missing.
- fix Dearmor and ensure correct permissions Wazuh key handling corrected for proper permissions.
- refactor Insert for selective doctypes Backport of selective-insert optimization.
- refactor Schedule weekend support from today for 3 months Fixed hardcoded date in weekend support rotation script and corrected rotation logic.
o
Other
2 breaking · 120 new features · 34 speed-ups · 125 fixes · 40 refactors
- breaking Synchronize camera media lifecycle Camera media ownership changes during device switches and unmounts were not synchronized, breaking recovery and E2EE republish.
- breaking Take charts v2 to the 1.0.0 bar Charts v2 cleaned up for v1.0.0 stability; breaking changes documented in migration guide.
- feat Give text elements explicit width modes Text elements now have explicit `Auto` / `Fixed` width mode control; new text starts centered in Auto mode, and side-handle drag flips to Fixed with a single undo.
- feat Dock and minimise the composer Mail composer now docks to bottom-right as non-modal, minimises to title bar, and remembers prior state—unblocking list/thread navigation while drafting.
- feat Table element in slides Insert tables via drag-to-grid toolbar, resize columns without edit mode, configure headers and banding, right-click for structure operations and distribution.
See all 321 changes
- feat Notifications in pilot New notification panel added to pilot.
- feat Replace Raw Styles with curated Base Styles editor Raw Styles replaced with searchable curated CSS property editor supporting per-breakpoint edits, ported from Builder.
- feat Add Notifications Panel to central New notifications panel UI component added.
- feat Revamp flowchart UX, node editing and connector routing Flowchart nodes now measured by actual shape geometry, connector routing avoids passes-through, text fits shape bounds, and the + button stays in reach.
- feat Run_self_serve(bake=False) for external golden Atlas can now skip built-in golden bake and assert external service-baked golden, enabling chef-as-a-service image sourcing.
- feat One bake wires signup + server goldens Chef pilot bake now registers both signup snapshot and server base image via Atlas service API in a single workflow.
- feat Register goldens as signup/server defaults via service API Service API can now register baked goldens as default bench snapshot for signups and default image for servers.
- feat Add site-scoped backup jobs endpoint New GET /sites//backup-jobs endpoint reports Backup Site jobs with status, timings, artifact sizes, and offsite status for audit compliance.
- feat Auto send metrics by flushing buffer Metrics now auto-flushed from buffer for timely ingestion.
- feat Log integration Datum log ingestion now supported with JWT token minting from central and verification via JWKS.
- feat Make Settings a dialog with its own sidebar Settings now groups preferences in a dialog with a sidebar, replacing a long single-page layout.
- feat Give each tool a summary that fits its row Each tool now carries a short summary (not a full description) that fits its row in All Tools, replacing ellipsis-truncated text.
- feat Open every tool on a worked example Tools now open showing a realistic worked example (e.g., "100 km/h → 62.1 mph") instead of empty inputs.
- feat Remove the copy control from every result panel Result copy buttons removed from all tools; users can select and copy as needed.
- feat Close each written section until somebody opens it Tool pages now present written sections as closed `<details>` elements, keeping the page scannable with the tool above.</details>
- feat Give the time-zone converter its own tool, under Convert Time-zone converter splits from World Clock as a standalone searchable tool, enabling deep links.
- feat Remove the Weather tool Removes Weather tool since phones already show forecasts and search engines rank weather results higher.
- feat Give a tool page one list of tools, not two Removes duplicate family lists from tool pages, eliminating redundant navigation.
- feat Add text case control and regroup text properties Adds text case (As typed, Uppercase, Lowercase) control and regroups text properties into Typography, Paragraph, and Spacing sections.
- feat Put Duplicate in the sticky note's More menu Moves Duplicate action to the sticky note's More menu, freeing toolbar space for frequently-used colors.
- feat View and tune MariaDB variables Adds a MariaDB variable browser and edit dialog under Settings > Database, with 51-variable catalog and 9-variable editable allowlist.
- feat One Team page, plus the profile endpoints Consolidates team settings and roster into one page; adds profile and password endpoints.
- feat Overview and Reports - show what the bill is made of Splits billing cycle into owed and estimated amounts; adds Next payment card and Reports page.
- feat One settings modal — desktop dialog, mobile pages Consolidates profile, notifications, and team settings into a single SettingsDialog.
- feat Add recipe for datum builds Adds datum build configs with clickhouse and datum service setup.
- feat Mint JWT for Datum Log service Central now mints log tokens for Datum log ingestion.
- feat Release tracking (pin tracked upstream repos per bake) Adds release tracking to pin specific upstream repo commits at bake time, enabling reproducible builds.
- feat Replace the briefcase icon with a spanner Updates the toolbox mark from a briefcase to a spanner, drawn to match Frappe's icon geometry.
- feat Make the mind map a brainstorming surface Fixes eight mind map interaction bugs: hovering affordances, draggable children, text overflow, and branch jumping.
- feat Lay the share dialog out like the one Slides and Writer share Rebuilds share dialog to match Drive's ShareDialog layout, with unified invite field and aligned role columns.
- feat Template library: 3 marketing templates + multi-category tagging Adds three marketing templates (Candor, Fetch, Recipe) with multi-category tagging support.
- feat Double-click empty canvas to type, in a box that hugs the text Double-clicking empty canvas now creates a text box sized to fit the typed content instead of a large fixed box.
- feat Add the shortcuts-v1 codemod for the v1 keyboard shortcut config Provides migration codemod to convert v0 flat-flag shortcut config to v1 combo strings.
- feat Scan for request and job hooks Adds before_request/after_request and before_job/after_job hook scanning to find-doc-save-hooks.sh.
- feat Find asset include hooks in custom apps Adds find-asset-include-hooks.sh to list JS/CSS/icon bundles custom apps inject into page loads.
- feat Move migrations to a standalone script & init resource rtracking Migrations now run standalone before service startup; adds resource tracking endpoint with Active/Terminated/Pending status.
- feat Draw the Shapes tiles with Lucide icons Shapes menu now draws tiles with Lucide icons instead of shape glyphs, matching the rest of the editor.
- feat Draw freehand strokes as curves, and stop reshaping them on release Freehand strokes now render as curves via quadratic Béziers instead of polylines, and no longer reshape when the pen is released.
- feat A migrated flowchart routes, retypes and labels itself correctly Migrated flowcharts now correctly route edges, retype connections, and apply label edits.
- feat A rounded rectangle picks its own roundedness, and it survives an export Rounded rectangles now pick from four corner radius presets; custom radius survives export.
- feat Feature/sms email otp Adds Twilio-backed SMS sending and OTP verification plus independent Email OTP via Frappe mail.
- feat Stripe-first billing: fallback rules, Amex/Diners routing, and the payment order card Adds payment method fallback on terminal declines, Amex/Diners routing, and customer notifications on method failure.
- feat Add job to check and repair database tables Adds job/API to run CHECK TABLE and auto-repair corrupted tables (REPAIR for MyISAM, OPTIMIZE for InnoDB).
- feat Rebuild the mobile composer as a page Mail composer is now a page-route on mobile instead of a dialog, fixing layout bounce and keyboard interaction.
- feat Pen/highlighter options open on tool click; both get size + opacity Pen/eraser/sticky/line each open their own popover; pen and highlighter both carry independent size and opacity.
- feat Delete diagrams instantly and settle the write in the background Bulk diagram delete is now instant; write settles in background instead of blocking the UI for ~60 seconds.
- feat Upload MariaDB audit logs to S3 Rotates `server_audit` logs, reads window metadata, uploads to S3, and deletes from disk.
- feat Trim the unified toolbar to essentials Toolbar trimmed to core tools; undo/redo, duplicate, and whiteboard-only features removed per product calls.
- feat Show custom page for werkzeug internal server error App errors that bypass Frappe now show Frappe Cloud's custom error page instead of bare werkzeug/gunicorn HTML.
- feat Expose distribute_image (host-to-host fleet sync, no S3) New service API entry point for Chef to fan an already-promoted image to the rest of the fleet host-to-host.
- feat Add event IDs + retry webhook event delivery Central webhooks now carry event_id for dedup; failed deliveries retry via cron instead of dying after one attempt.
- feat Image propagation from the Chef UI + CLI, and worker-backed baking Wires image baking and fleet propagation through Chef UI and CLI, backed by Atlas's host-to-host sync API (no S3).
- feat Add the two missing Tabs breaks Migration guide now documents `direction="right"` → `side="right"` and type export changes for Tabs 2.0.
- feat Upgrade echarts to v6.1.0 Echarts 6 fixes label clipping and text layout issues via improved `containLabel` and `textStyle` fallback.
- feat Refactor(charts)!: park the old Charts family in experimental Six old chart components (`AxisChart`, `DoughnutChart`, etc.) move from root export to `frappe-ui/experimental`; Charts v2 at `frappe-ui/charts` is now the supported family.
- feat Corner resize handle for images and embeds, gradient video controls Images and embeds get a single bottom-right grip with diagonal-resize glyph; videos get gradient controls overlay.
- feat Say who made this, and what else they make New `/about` page explains Toolbox's mission, that tracking is disabled, links to source code and ERPNext.
- feat Give every page a heading, and the root a link to every tool Root and data-sources pages now have proper headings and SEO; root includes links to all tools.
- feat Say where every dataset and API comes from New `/data-sources` page documents dataset licence, version, publish date, import date, and row counts for all bundled data.
- feat Serve the font the offline shell already cached Service worker precached fonts without query strings; stylesheet requested them with query params, cache miss. Service worker now matches on cache-aware key.
- feat Persist inbound events before processing, dedup on event_id Inbound Atlas events now durably persisted before handling, with unique constraint on event_id for race-safe dedup of retried deliveries.
- feat Host-to-host local-image distribution over HTTP (no S3) + Sync Across Hosts Promoted snapshot images can now be circulated across the fleet over on-host HTTP without an object store, plus a "Sync Across Hosts" Desk action.
- feat Composed Tabs family, TabButtons parity Tabs rewritten as a composed family (TabList / TabTrigger / TabPanel) with trigger-value model and RouterLink support.
- feat Collapsible sections in editor Added toggle sections to the rich and comment editors via `/` menu, toolbar button, or `>>` shorthand.
- feat Upgrade Boat button in the Desk UI Operators can now roll boat generation (binary, sudoers, units) fully from the Desk UI with verification and daemon-stayed-up checks.
- feat Rank recipient suggestions by correspondence Recipient suggestions now ranked by frequency of prior correspondence, not just name match.
- feat Grant Guardian desk access and Sales Invoice permissions Guardians can now view student fees via Desk and Sales Invoice access wired through install and patches.
- feat Add SFU human-empty grace cleanup Added grace period for cleaning up SFU rooms after all humans leave.
- feat Add Anton and Courier Prime fonts Presentations can now use Anton and Courier Prime as self-hosted `woff2` with unicode-range subsets.
- feat Custom alerting Users can now set up custom alerts for system metrics and site uptime with webhook notifications.
- feat Billing UI polish: invoice receipt panel, limit tiers redesign, shared list and panel infra Invoices list now has a docked receipt panel; limit tiers show progress; overview cards have consistent anatomy.
- feat Add central settings Created a doctype for general Central settings and feature flags.
- feat Add recorder telemetry dashboard Added telemetry dashboard for meeting recordings.
- feat Lock elements in slides Slide elements can be locked to prevent accidental moves or edits; lock/unlock from right-click menu or Cmd+Shift+L.
- feat Stripe as a primary gateway Stripe now accepted as primary payment gateway; carries cards and India e-mandates; Razorpay handles RuPay/UPI/netbanking.
- feat Gather the synonyms of every sense into one list Dictionary now groups all synonyms by part of speech instead of scattering them across senses.
- feat Charts v2 New chart library with Bar, Line, Area, Scatter, Donut, Funnel, Heatmap, Sankey, NumberCard; flat props naming columns as plain strings.
- feat Write the remaining 32 tool pages All 34 tools now have ~700-word pages with formulas, worked examples, FAQs, and JSON-LD for crawlers.
- feat Send a heading and the page content to a crawler Tool pages now send rich content to crawlers (h1, description, sections, JSON-LD) instead of running on JavaScript.
- feat Unwrap block Right-click > Unwrap now promotes an inner block as root or adds all children to parent, useful for replacing Studio Component wrapper divs.
- feat One compact zoom control on the toolbar; the canvas is clear Four float zoom buttons consolidated to one toolbar entry showing live percentage and a menu; frees bottom-left canvas space.
- feat One left-aligned toolbar that fits, with the four inserts promoted Toolbar reorganized left-aligned with four insert buttons (shapes, lines, text, image) promoted to the main bar.
- feat Enforce scoped role grants (Central-side) Team member resource grants now actually scoped per server/site, enforced through IAM.
- feat Put undo and redo on the toolbar, and make canUndo actually change Undo/redo moved from keyboard-only to toolbar buttons; fixed `canUndo` state to actually track history.
- feat Export is a dialog you confirm, not a menu that fires on click Export now opens a dialog to pick format, raster scale, and see preview with pixel size before confirming.
- feat Collections — group diagrams on Home (backend) Added `Draw Collection` and `Draw Collection Member` doctypes for labeling diagrams.
- feat Collections on Home — filter chips, and filing a drawing into one Diagrams can belong to multiple collections; Home shows filter chips; clicking a chip narrows the list.
- feat Give the nine unit converters their own routes Nine unit converters split from `/unit-converter` into `/length-converter`, `/weight-converter`, etc., with their own titles and pages.
- feat Give the four health calculators their own routes Four health calculators (BMI, BMR, TDEE, Pace) split from shared tab to individual routes.
- feat Give the six financial calculators their own routes Six calculators (EMI, SIP, Compound Interest, CAGR, etc.) split from shared tab to individual routes with dedicated SEO.
- feat Give the PIN and IFSC lookups their own routes PIN and IFSC code lookups split from shared tab to individual routes with dedicated SEO.
- feat Give the timer, stopwatch and countdown their own routes Timer, stopwatch and countdown split from `/timer` tab to `/timer`, `/stopwatch`, `/countdown-timer` with individual titles.
- feat Serve robots.txt and a sitemap that lists every tool Generated `robots.txt` and `sitemap.xml` that list all 34 tools for crawlers.
- feat Mind-map node redesign — monochrome look, Espresso colour, hover/selection, text menu Nodes default to uniform gray box; colour is opt-in via Espresso swatch grid. Hover and selection consistent, no rotation, text-only formatting menu.
- feat Split the insert palette onto the canvas toolbar Bottom palette gone, five categories split into toolbar entries. Canvas is clear of floating chrome.
- feat Move the mind-map and flowchart controls onto the canvas toolbar Four floating bars folded into toolbar; bottom palette's map-wide actions consolidated.
- feat Move the block selection's controls onto the canvas toolbar 22 controls from floating block editor become toolbar groups; makes toolbar real for default document type.
- feat Move the whiteboard controls onto the canvas toolbar Three floating toolbars (selection editor, sticky note, table cell) moved to canvas toolbar.
- feat Canvas toolbar frame and one selection resolver Static toolbar below title bar as frame for moving all eight floating menus. Nothing moves yet, all bars work as before.
- feat Flat, Frappe-Drive-style Home list with sortable headers De-carded rows, flat table with hairline separators, hover and selected fill, sortable headers. QA'd live.
- feat Drop the type glyph from Home's list rows Type glyphs were neutral and only pushed titles right; row and header glyphs both removed.
- feat Drop Rename from the "..." menu, and name the pin action Pin Removed Rename (redundant with clickable title), renamed Favourite/Unpin to Pin with real pin icon.
- feat Per-cell bold, italic and underline in whiteboard tables Formatting applies to selected cell text or shift-clicked range. Model lives in cellRuns alongside plain-text cells.
- feat Icon-only Export and Share in the editor top bar Export and Share now ghost icon buttons like Comments and the menu, one consistent row.
- feat Park the v0 TextEditor family in frappe-ui/experimental Deprecated TextEditor moved to experimental for apps mid-migration; v0 imports redirected.
- feat Feat(Alert)!: redesign for espresso 2.0, add SidebarCard Alert redesigned content-driven with theme colours; SidebarCard split out as new sidebar promo card.
- feat Add rate limits Calendar event creation/edit mails invites to participants; new rate limits prevent fan-out abuse like outbound.send.
- feat Editing nested fragments (dialogs inside dialog, dialogs inside studio component) Nested overlays now show in breadcrumbs for easy navigation. Can now click overlay components on canvas to edit them.
- feat Find a city by the name it is known by locally GeoNames names places in most-common language, so "München" and "Roma" had no matches. Search now uses alternate names column.
- feat Move Weather off Open-Meteo to MET Norway and a bundled city dataset Open-Meteo free tier is non-commercial only; moved to MET Norway CC BY 4.0 data and bundled city dataset, unblocking auth removal.
- feat Live "On this page" TOC beside the editor "On this page" outline built from live ProseMirror doc beside editor; scrolls to headings on click. Collapses to reader strip on mobile.
- feat Render per-route page metadata on the server Each tool route now sends unique title, description, and structured data so crawlers and search engines know Weather and Calculator are different pages.
- feat Remove the eight tools cut in the account-free pivot Registry drops 23→15 tools. Expenses, Library, Reminders, Checklists, Notes (account-only) and Tone Generator, Metronome, Audio Inspector (focus) removed.
- feat Remove the authentication layer: no accounts, no stored user data Toolbox now free public website with no accounts, no user records. DocTypes drop 22→5 (read-only reference data), backend LOC ~2,300.
- feat Audio Recorder: capture in the browser, save to the visitor's device Recordings no longer stored on server (removes last owner-private records). Browser captures with 10-minute/100 MB limit, saves to device.
- feat Serve Toolbox at the site root Tools now at frappe.tools/calculator (not /toolbox/calculator); root itself is All Tools. Rebase required Frappe router integration.
- feat One search-and-select field with a real combobox Three tools (World Clock, Weather, Dictionary) had near-identical search fields with accessibility bugs; unified into one real combobox.
- perf Parallelize media assertions Meet E2E group tests reduced by ~17 seconds by awaiting independent host/guest assertions concurrently and replacing fixed teardown delay with participant departure state.
- perf Use frappe-ui submodule via opt-in symlink Frappe-ui submodule now symlinked instead of added to workspaces, avoiding `yarn.lock` churn for users who don't init it.
- perf Speed up end-to-end tests Meet E2E tests now run independent media assertions concurrently while keeping guest joins serial, reducing longest job from 6m27s to ~5m40s.
- perf Draw history empty state with ToolState ToolHistory now uses ToolState component with custom icon override, removing duplicate empty state implementation.
- perf Build sidebar from frappe-ui's Sidebar AppSidebar replaced with frappe-ui's Sidebar component, consolidating toggle state and child injection.
- perf Refactor(shortcuts)!: one combo string, a dialog instead of a modal, and two documented behaviors Standardizes keyboard shortcuts to use combo strings (e.g., "Mod+S"); documents contract; renames KeyboardShortcutsModal to Dialog.
- perf Refactor(CommandPalette)!: rebuild as a seven-part family in experimental Rebuilds CommandPalette as composable parts, moving to experimental; allows apps to reuse components without forking.
- perf Tighten Meet E2EE test timeouts Caps two-participant E2EE Meet scenarios at 90 seconds, with 180-second exception for four-participant scenario.
- perf Balance Meet end-to-end groups Replaces duration-blind Playwright shards with three duration-aware test groups, balancing historical test times.
- perf Speed up end-to-end tests Prebakes Python, Node, Yarn, and CLI into the ARC runner image; archives node_modules by manifest hash; cuts test setup time significantly.
- perf Event detail panel and blocked-images banner Hides empty event detail sections; fixes blocked-images banner split on mobile.
- perf Calendar invite strip, responsive event emails Reformats event invite strips to show dates as chips; fixes all-day event formatting and responsive email layout.
- perf Pin that a shared diagram reaches the recipient's list Adds test confirming shared diagrams appear in recipients' lists via standard permission list queries.
- perf Record what the guide now gets wrong about itself Updates CLAUDE.md with current test counts and matrix runtime after recent session work.
- perf Refactor(Badge)!: remove the deprecated theme="orange" alias, harden the theme lookup Removed `theme="orange"` alias and hardened theme lookup to catch future mistakes.
- perf Refactor!: close four cross-family vocabulary mismatches before the freeze Picker slot props renamed `{isOpen, togglePopover}` → `{open, toggle}` and other vocabulary mismatches fixed.
- perf Fix slower selection in a huge block tree Watch selected block IDs instead of whole tree in Layers panel; auto-dispose overlay trackers.
- perf Read the v1 migration guide end to end against the code Migration guide re-verified against real code; 3 false entries deleted, 22 corrected, ~40 new breaks added.
- perf Separate removed components from parked ones Docs now distinguish between removed and parked v0 components.
- perf Improve rendering & data handling on route param changes Navigating between dynamic route params no longer rebuilds the entire page; block tree stays mounted, only route-dependent data refetches.
- perf Harden SFU recording isolation Improved isolation and robustness of SFU recording logic.
- perf Shift chromatic ink scales one level for the updated espresso v2 export Espresso v2 shifted chromatic ink scales; automated token migration across 51 files.
- perf Use disc icon for start recording Changed recording button icon to disc for better visual clarity.
- perf Enhance team section and invite Refactored IAM team and invite UI.
- perf Frontend consolidation Extracted `useFleetRows`, split server hover card, created shared `RowActionsMenu` and `ConfirmDialog`.
- perf Stop Home downloading every diagram's document Home list response reduced from 25.8 kB to 2.6 kB by lazy-loading full documents only for diagrams without saved thumbnails.
- perf Refactor(tokens)!: remove deprecated radius aliases and text-*-black Deprecated radius aliases and black weight styles removed per ADR-0006/0008. Numbered tokens are canonical.
- perf Refactor(Calendar)!: park in frappe-ui/experimental Calendar does not ship at root for 1.0.0; moved to experimental with no stability promise, same pattern as ListView.
- perf Refactor(ListFilter)!: delete ListFilter and SearchComplete ListFilter failed vocabulary test. Deleted with zero external consumers; frappe-ui/list is the composition-based replacement.
- perf Refactor!: remove frappe-ui/frappe and frappe-ui/drive, delete frappe/ 32 Frappe SFCs moved to @framework/ui in frappe/frappe#41671. Root exports, tailwind globs, docs config cleaned up.
- perf Refactor(icons)!: move spritePlugin, IconPicker and sprite Icon to frappe-ui/experimental Still used by crm, insights, suite, press; moved to experimental outside 1.0.0 freeze so app authors can migrate.
- perf Refactor(ListView)!: move ListView family to frappe-ui/experimental ListView not taken to root for 1.0.0. Moved to experimental (P14) until frappe-ui/list reaches parity on config-driven columns.
- perf Let the Dropdown stub open, so menu options are testable Dropdown stub now models open state so menu options are reachable; last coverage gap from #145.
- perf Make the component stubs match the real observable surface Button stub now reproduces icon-only, label/aria-label precedence rules so 62 buttons of #134 pass tests.
- fix Table resize preview snapping back mid-drag Table frame width flashed back to original while dragging column edges due to live document redraws overwriting preview state.
- fix Ignore stale keyframe requests Keyframe requests from already-closed consumers were not idempotent, surfacing errors instead of silently ignoring stale work.
- fix Send RFC 3339 date-time in HOLDUNTIL envelope parameter Scheduled sends failed against Stalwart >= 0.16.17; HOLDUNTIL now sends RFC 3339 date-time instead of Unix timestamp per corrected RFC 4865 compliance.
- fix Skip recorder-dependent reconciliation when no recorder is configured Scheduled job raised `ValueError: URL must be configured` for every pending recording on sites without a recorder, creating error logs on every run.
- fix Move standard studio app builds from `after_build` to `after_app_build` hook Studio app builds now only run when Studio itself is built, not on every app build.
- fix Block installing Suite when a standalone suite app is installed Install fails with a helpful error listing conflicting standalone apps (Calendar, Drive, Mail, etc.) that must be uninstalled first.
- fix Require upload access to probe folder filenames `does_entity_exist` and `get_new_title` APIs whitelisted without permission checks, allowing any logged-in user to enumerate folder contents and probe for file existence.
- fix Tighten chat link wrapping Long chat URLs no longer wrap at preferred punctuation with misleading gaps; uses link-specific break-all wrapping.
- fix Drive preview framework attachments Drive previews now render framework-created attachments by normalizing MIME types and preserving WebP metadata.
- fix Bind dialog's renamed open model Settings dialog now opens correctly after frappe-ui's v1.0.0-beta.52 model rename.
- fix Resolve @tiptap/core from studio for exported apps Custom TextEditor extensions in exported apps no longer fail to build; @tiptap/core now resolves from Studio's dependency tree.
- fix Keep bench-cli entrypoint for Atlas self-serve deploy Pilot golden image now preserves bench-cli entrypoint symlink, enabling site deployments via Atlas.
- fix Cache-bust mermaid loader in SPA Mermaid preview no longer fails with stale oklch color format; loader asset now versioned for cache busting.
- fix Install openssh-client for atlas builder Atlas builder now has SSH client to reach build VMs, enabling production image baking in docker-compose.
- fix Wait for SSH after start() before warm_arm Warm bake mode now waits for guest SSH readiness after boot before attempting snapshot, fixing race condition.
- fix Drive golden CLI as pilot post-rename Self-serve site deployments now locate pilot executable correctly after bench-cli rename.
- fix Relax host-key checking on ProxyJump host Atlas builder no longer hangs on fresh containers; ProxyJump host key checking relaxed to match guest.
- fix Restore emoji popup background Meet chat emoji suggestion popup now renders with correct background using current design tokens.
- fix Scroll selected component into view in layers panel Layers panel now auto-scrolls to show selected block without manual panel scrolling.
- fix Tab title, slideshow video controls and cursor Slides now shows presentation name in tab title, hides video controls while playing, and hides cursor after idle.
- fix Scope mark_as_read to the notification's recipient Any logged-in user could mark another user's notifications as read, hiding shares and other communications before the recipient saw them.
- fix Include unbooked and unaccrued interest in Security Deposit Adjustment payable amount Interest accrued but not yet raised as a Loan Demand was excluded, causing legitimate adjustments to be incorrectly rejected.
- fix Show a loading skeleton instead of the empty state Notifications page now shows a loading state while fetching instead of briefly showing "You're caught up" with an unread badge.
- fix Load Shipment form script via doctype_js Shipment form initialization now works correctly through the standard doctype_js mechanism.
- fix Fix Map Pins stacked on top left on Safari Map pins no longer stack in the corner on Safari when navigating to the Servers page.
- fix Multiple interaction fixes "Offline" message now only appears when the server is unreachable; improved text selection and pin fill; fixed selection context clearing.
- fix Authorizations and owner alignment issues Mail Cluster Store records are preserved during migration; disabled/deleted users are skipped during RSVP sync; Suite User role permissions aligned.
- fix Settings and navigation Tool checkboxes now have proper spacing; Reset settings now resets the tool list; page scrolling fixed.
- fix Accessibility and layering Slider now forwards aria-labelledby to the actual slider element and calls useAttrs() for aria-label support.
- fix Menu contrast Danger menu items raised to red-7 for WCAG AA contrast in dark mode.
- fix FloatingWindow z-index FloatingWindow drops to z-40 to sit above chrome but below dialogs, fixing dialog unreachability.
- fix Get_template_bundle 403s on a hub with renamed token doctype Page template loading now works on a hub with a renamed token doctype.
- fix Unicommerce tax returns backfill Credit note creation for RTO and customer returns now selects correct invoices, handles multi-package returns, and syncs historical returns.
- fix Firefox microphone device fallback Media capture now retries without exact device constraints and covers Firefox's NotFoundError.
- fix Ignore commented-out lines in hook scan Filters commented-out hook registrations from scan results using `^[^#]*` anchoring.
- fix Require site admin to preview files on disk `sync_preview` had no permission check, allowing any logged-in user to retrieve full listings of staged files with paths, sizes, and MIME types.
- fix Make every whitelisted write POST-only Eleven of Draw's write endpoints were accepting GET requests, opening them to cross-site request attacks; now all whitelisted writes require POST.
- fix Raise z-index above sticky ListGroup headers Dialog backdrop and content were rendering behind sticky list headers; added z-index containment to fix layering.
- fix Let the browser keep modified arrow keys Tree was swallowing Alt/Cmd+Arrow and Ctrl+Home/End before checking for modifiers; now returns early when modifier keys are held.
- fix Center More menu rows on iOS Safari More menu rows were vertically misaligned on older iPhones due to WebKit's anonymous inner box; added alignment fix.
- fix Guard migration patches against sites missing legacy schemas Migration patches crashed on sites restored from single-app backups that lacked legacy tables; now guards against missing schemas.
- fix Stop Recents from freezing the tab in list view Recents passed a freshly-built grouper object on every render, causing ListView to retrigger itself infinitely; now memoizes the grouper.
- fix Compare against the namespaced route names Six route comparisons still tested against old bare names instead of namespaced names, keeping files openable and star badges hidden in Trash and Favourites.
- fix Text overflow and selection in editor Clicking under the multi-selection box now selects the element; text boxes wrap at slide edges; long words wrap whole without hyphenation.
- fix Take the diagram from the form data when an image is uploaded Image uploads broke when routed through `upload_diagram_image`; now takes the diagram from form data instead of request context.
- fix Use text-p tokens and add min height Textarea used tight text scale instead of paragraph scale; added min-height to prevent collapse.
- fix Rename the diagram title through frappe-ui, so the blue focus ring goes Rename box was a hand-rolled input with browser focus ring on top of it; now uses frappe-ui's TextInput which handles focus styling.
- fix Use text-ink-base on solid red in light mode Solid red button now uses white text in light mode; dark mode unchanged.
- fix Scale slide previews to their actual card width Slide thumbnails in grid view now scale to their actual card width.
- fix Force the exit thumbnail only when the session actually saved Forced thumbnail regeneration on exit now only happens for editable sessions, not read-only views.
- fix Restore the tooltip on reaction pills Reaction tooltip was using outdated Tooltip slot name; updated to `#content`.
- fix Regenerate the home tile thumbnail on exit, past the 30s throttle Diagram thumbnails now regenerate on exit even if the final save lands inside the 30s throttle window.
- fix Clip the active pill's shadow to the track Sliding pill indicator's shadow now clips to track; removes shadow bleed past rounded edges.
- fix Serve template media in shared presentations Shared presentations can now access media files attached to templates.
- fix Don't cache template list for an hour Removed redis cache from `get_templates`; bulk query for child rows now replaces per-template get_doc.
- fix Clean up dead ink class name and update ink-shift refusal message Removed stale `text-ink-gray-700` class name and updated ink-shift refusal message.
- fix Keep app-owned folders open for create App-owned folders were locked down for file creation; restored permission so Mail compose can upload attachments.
- fix Stop deck saves from retrying deleted thumbnails Saving a deck logged "Error Attaching File" on every save; two patches disagreed about thumbnail location, causing 404 retries.
- fix Marking a document as favourite in Writer sync to Drive's Favourites tab Favouriting a document in Writer didn't sync to Drive, and after a partial fix it made the editor read-only until reload.
- fix Make the mobile Profile tab a page Profile was the only tab that opened a bottom sheet instead of navigating; Settings row pointed to a page that had its own Profile row. Collapsed into a single route.
- fix Avoid false local network warnings Local downlink warnings were triggered by reported RTP packet loss alone; now driven by confirmed consumer stalls, avoiding false positives.
- fix Avoid text clipping at the bottom fix(meet): avoid text clipping at the bottom
- fix Confine upload staging paths fix(drive): confine upload staging paths
- fix Separate recorder deployment from SFU Recorder was co-located with SFU; separated into standalone deployment to isolate concerns.
- fix Keep navbar behind dialogs fix(drive): keep navbar behind dialogs
- fix Include properties when fetching EventNotification fix: include properties when fetching EventNotification
- fix End the link when a space is typed at its end Typing a space after a link pulled the space inside the anchor, and everything after it inherited the mark — whole sentences became accidentally linked.
- fix Move the end time when the start time changes Editing event start time left end time alone, allowing invalid end-before-start; now drags end along to preserve the prior gap.
- fix Set bake job_timeout — arq's 300s default aborts fleet bakes Async fleet bakes were cancelled after ~300s because WorkerSettings never set job_timeout; real builds take minutes to hours.
- fix Use default FUI for listview fix: Use default FUI for listview
- fix Stop content_doctype/content_docname from being forged A File document could link any Drive File to another user's content, inheriting full access and risking cascade deletion. Locked the fields to prevent forgery.
- fix Check upload on the parent instead of granting create Drive's generic API was granting `create` unconditionally, bypassing the parent `upload` check that Drive's own endpoints enforce.
- fix Bootstrap sets the server Active on success Server bootstrap completed but never transitioned to `Active` status, leaving the documented adopt→Bootstrap→Active flow broken.
- fix Bring up boat's HTTP listener and ANCP units at bootstrap Freshly bootstrapped hosts came up with wg-mesh DOWN; the systemd units were never enabled or started during bootstrap.
- fix Virtual machine stop must wait past boat's graceful drain VM stop timeout (30s) was shorter than the graceful shutdown it waited for, causing stale `Running` status even though the VM actually stopped.
- fix Sudo the image presence probe for 0700 directory Image presence check failed on synced hosts because the boat user cannot stat a 0700 root directory.
- fix Grant lvremove of regular snapshot LVs in sudoers Terminating a VM with a snapshot failed because the sudoers allowlist only covered migrate snapshots, not regular ones.
- fix Harden recording ingestion and recorder reliability Improved recording robustness and validation during ingestion.
- fix Keep the dialog stack on one instance across package copies `dialog.confirm()` rendered nothing in dev because esbuild pre-bundling created separate instances of the package, splitting the dialog stack.
- fix Keep adjacent lists merged so numbering continues Deleting an item and its empty line split an ordered list, restarting numbering at 1 instead of continuing.
- fix Render ToastProvider before the slot so early toasts land Toasts fired during app setup were dropped because the provider hadn't subscribed yet; reordered to catch early toasts.
- fix Show replies that land in already-loaded threads Incoming replies to already-visible threads were silently dropped; now updates the thread in place and re-sorts.
- fix Rank recipient suggestions by relevance Recipient search returned unscored results ordered by insertion instead of match quality; now ranks by relevance and correspondence frequency.
- fix Flaky undo-delete and 403 on shared presentation media Undo could lose slides; media access checked a random File row instead of the presentation's actual files.
- fix Stale responses no longer write docStore/listStore Concurrent writes could leave the stores with stale data from the response that settled last, not the newest one.
- fix Remove transition flashbang when theme switching Theme switches caused a visual flash because transitions remained active; now temporarily disabled during switch.
- fix Stop legacy /g/ URLs from landing on 404 Old `/g/teams` links (from when the app lived at `/teams`) redirected to 404 instead of the community page.
- fix Share the body measurements calculators claim to share Four health calculators promised to share body measurements but didn't; now they actually do.
- fix Keep the timer workspace for the browser session, not forever Timer, stopwatch and countdown persisted to `localStorage` across browser sessions instead of clearing.
- fix Show the forecast in the unit the visitor chose Temperature unit setting was ignored; weather always showed Celsius regardless of choice.
- fix Keep the calculator and dictionary histories for the session Calculator and dictionary histories persisted to `localStorage` forever instead of for the session only.
- fix Hold the dataset import lock until the rows are committed Dataset import lock was released before rows committed, allowing concurrent imports to corrupt each other.
- fix Recorder speaker sync Fixed speaker synchronization issues in call recording.
- fix Use room ID as fallback name for recording files Recording files now use room ID as fallback when title is unavailable.
- fix Imperative dialogs and toasts don't work in dev mode Dialogs and toasts fired imperatively didn't show in dev; excluded frappe-ui from optimizeDeps to dedupe state.
- fix Let a diagram's owner change and revoke the access they granted Changing a collaborator's level or revoking access failed for non-admins on all but the first share.
- fix The minimap draws the diagram, not an approximation of it Minimap rendered whiteboard objects as grey boxes instead of their actual content (ink, highlighter, tables).
- fix Stop pointing users at the palette that is gone Onboarding copy pointed at a toolbar palette that was removed.
- fix Print the canvas exactly, with no added whitespace Print added a white band below the diagram when the page ratio didn't match canvas ratio.
- fix Pinning belongs to Home, so drop it from the editor's menu Editor ignored the five-pin Home limit, letting users pin unlimited diagrams from inside.
- fix Draw the Shapes menu with the shapes icon, not a lone square Shapes menu button showed a rectangle icon (the first shape) instead of the category icon.
- fix Write Outgoing settings to Account Settings after model sync Migrate failed because a patch tried to write columns that didn't exist yet (created by model sync).
- fix Guard legacy screening patches against missing account_id Migrate failed on sites that hadn't yet migrated legacy screening doctypes (which were deleted).
- fix Dedup host across sibling mounts Inject guard in Dialogs.vue only saw ancestors, so sibling provider and slot content hosts both mounted and rendered dialogs twice.
- fix Give setValue, delete and doc methods isolated call state Multiple submit calls on the same useDoc member shared one useCall, so a second submit aborted the first mid-flight and both resolved off the same data ref.
- fix Emit oklch from sync-tokens sync-tokens regenerated colors.json in hex, reverting manual oklch conversion; now includes hex-to-oklch converter.
- fix Fix(useCall)!: a throwing beforeSubmit cancels the submit beforeSubmit throw was caught and logged without surfacing, request sent anyway. Now properly cancels submit and rejects.
- fix Make the sticky note's floating toolbar render again Toolbar was a Teleport from an SVG `
- fix Remember the Home layout, and recover from a dead thumbnail Home tile/list choice was not persisted; now survives reload. Dead thumbnail recovery added.
- fix Let double-click open a table cell again Double-clicking a whiteboard table cell selected the table instead of opening it for edit; selection change cleared editingCell.
- fix Give JPEG its own icon in the export menu PNG and JPEG both drew the same icon; JPEG now uses file-image for clarity.
- fix Drop Home's end-of-list marker, word each empty view for its tab Unhelpful end-of-list marker ("reached the end") dropped; empty states now tailored per tab with actionable messaging.
- fix Stop Button label from silencing the descriptive aria-label Button label prop overwrote aria-label; 38 calculator keys lost descriptive names (√x announced as "√x" instead of "Square root").
- fix Bind slider values as arrays so they stop pinning to the minimum All seven sliders bound scalars instead of arrays, pinning thumbs to minimum (120 BPM read as 30, 50% volume as 0).
- fix Finish #303 — tokenize pin star, Divider separators, off-scale text Pin star tokenized, separators converted to ``, off-scale text normalized.
- fix Normalise off-scale text, dead borders, raw status colours to tokens Off-scale `text-[Npx]`, dead `border-black/10`, and raw status colours across 28 files replaced with frappe-ui tokens.
- fix Read the theme from the key the store writes it to Theme resolver read from old localStorage key after migration; dark mode preference was lost.
- fix Prevent flash while switching theme Theme swap strobe — every transitioning element landed at different times. Suppress transitions during swap.
- fix Recording indicator sync with non hosts Recording indicator did not sync across non-host participants.
- fix Name the tempo slider, drop dead slider attributes, use Badge amber Slider never bound $attrs, so class and aria-label reached no element; seven sliders carried dead labels.
- fix Compile recorder layout styles Recorder layout styles now compiled.
- fix Purge versions when a document is deleted Drive's `clear_deleted_files` failed on Writer files because Writer Version links to deleted Writer Document; now purges versions on delete.
- fix Preserve unwrapped join response Join response wrapping issue fixed.
- fix Handle missing entity_name in get_entity_with_permissions Missing entity_name parameter raised TypeError 500 before error handling; now optional with graceful fallback.
- fix Tune rate limits and cover missing endpoints Rate limits were too tight for normal signup flow; adjusted and added missing endpoint coverage.
- refactor Type-check the library on every PR CI now runs `vue-tsc` and fixed tsconfig that hid 38 type errors via incorrect baseUrl resolution.
- refactor Describe the site that exists now in README README updated to reflect current site structure and 34 tools; removed stale weather tool and outdated data sources.
- refactor Update frappe-ui version Dependency update.
- refactor Keep asset include console statements on one line Fixes bench console execution by flattening multi-line statements; adds find-asset-include-hooks.sh.
- refactor On latest python versions packaging has been removed Vendors packaging module for compatibility with latest Python versions.
- refactor Keep server script console statements on one line Fixes bench console execution for server script hook scanning by flattening statements into single lines.
- refactor Centralize the stale-write gate in docStore and listStore Stale-write gate is now centralized and mandatory; write sites can no longer opt out.
- refactor Cleaner frontend packaging Merged separate frontend package into main package.
- refactor Remove read endpoint till central asks for it Removed unused reads endpoint; Insights is the only current reader.
- refactor Remove orphaned design-token swatch components Legacy Design System swatch components were unused after foundations pages launched; removed dead code.
- refactor Retire map zoom and pan, polish the servers pages Servers map simplified to one interaction model; hover cards carry detail, clusters open in place, only picker mode frames itself.
- refactor Add nightly test evidence Run full Suite, E2E, type-policy, and linter coverage on staggered nightly schedules; publish 30-day JUnit, coverage, worker, scheduler, recorder, and audit evidence.
- refactor Upgrade frappe-ui to 1.0.0-beta.45 Upgraded 501 commits (51 file token renames, 4 ink scale shifts, CSS subpath removals).
- refactor Add access and recording tests Added tests for Meet access control and recording functionality.
- refactor Move the release changelog onto the docs site Changelog moved from `v1-release/changelog.md` to `docs/content/docs/changelog.md` with updated links.
- refactor Capability docs + Atlas test safety + CI Updated `CAPABILITIES.md` (13→15 caps), scoped Atlas tests to their regions, documented IAM specs.
- refactor Source-scoped vue-tsc type-check gate Added CI gate for `src/` type checking; `frappe-ui` deps are permitted to have type errors.
- refactor Correct four stale claims in the development guide Fixed outdated routing, Home/favorites, account info, and next-steps in `CLAUDE.md`.
- refactor Record the tool set the tab split produced Updated `CLAUDE.md` to list all 34 tools and document which ones share a view.
- refactor Lint the frontend for correctness Added ESLint to catch undefined identifiers like the one that broke zoom (found only at runtime, not in `yarn build`).
- refactor Finish the canvas toolbar — accessible names, dead state, docs Added 13 missing accessible names (`aria-label`, `aria-pressed`), visible "disabled" states, and docs links.
- refactor Migrate internal rounded-* aliases to numbered radius Mechanical vocabulary sweep per ADR-0006. Pixel values identical—no visual change. Unblocks alias removal.
- refactor Retire the LucideIcon shim for lucide CSS classes LucideIcon shim was redundant — frappe-ui preset loads lucideIconsPlugin, so lucide-* classes work. All 63 call sites now use `<span class="lucide-…">`.</span>
- refactor Move Home and Trash to useList/useCall Migrated off deprecated createListResource/createResource to frappe-ui composables. Endpoint parity verified.
- refactor Un-trap old lock/hide flags on load; drop the dead convert method Load-time migration clears locked/hidden from old documents so they're not stuck un-selectable/invisible.
- refactor Migrate Popovers to the modern frappe-ui contract Every Popover migrated to v-model:open + flat slots (#target→#trigger, #body-main→#default).
- refactor Reconcile snapshots with live events Shared Module for snapshot reconciliation merges events in arrival order, prevents stale/duplicate events.
- refactor Use participant connection lifecycle Replaced manual Meet setup sequence with one Participant Connection start operation.
- refactor Own participant connection lifecycle Participant Connection Module with explicit lifecycle states (starting, syncing, ready, degraded, recovering, stopping, failed).
- refactor Type recorder protocols Recorder page/server/SFU message types with callback, ffprobe, browser message checks before use.
- refactor Validate frontend protocols API/Socket.IO message validation with named types for participants, media, transports. Removed explicit any and unsafe casts.
- refactor Type SFU protocol boundaries Exact SFU request/event types shared by client and server; auth tokens, participant data, producer details validated.
- refactor Centralize SFU configuration SFU configuration centralized.
- refactor Move to the shared frappe-ui editor Notes used deprecated TextEditor from main entry; moved to frappe-ui/editor (same editor Gameplan and Writer use).
- refactor Use TabButtons for the countdown mode selector Last pair of native radios replaced with TabButtons strip to match Timer/Stopwatch/Countdown control above.
- refactor Frappe-ui/list stands on the extensible-family limb Amended ADR-0010's list row now that ListView moved to experimental; no API change.
- refactor Sync editor.md public surface list Added missing editor exports (Attachment, MediaDrop, TableNavigation, etc.); corrected type references and v0 import paths.
- refactor Enforce type safety policy Type-safety check rejects Record, explicit any, and production as unknown as casts. Pre-commit and GitHub Actions coverage.
- refactor Record why the test suite fails straight after a migrate Documented reason: dataset import holds row locks on tables the test suite clears, causing QueryTimeoutError 150s later if run immediately.
- refactor Trim the review prompt and add a /5 score Review prompt trimmed 267→109 lines; removed redundant sections, kept vocabulary and checklists, added /5 score.