desk-customization

Customize Frappe Desk UI with form scripts, list views, dialogs, and client-side JavaScript APIs.

62|23|Updated Feb 7, 2026
One-click install
npx skills add https://github.com/lubusIN/frappe-skills --skill desk-customization-lubusin
Or copy as Structured Prompt for Agent▼
Please help me install this Agent Skill.
Skill: desk-customization
Source: https://github.com/lubusIN/frappe-skills/tree/main/desk-customization
Command: npx skills add https://github.com/lubusIN/frappe-skills --skill desk-customization-lubusin

SYSTEM DOCUMENTATION & REQUIREMENTS

💡 This Skill includes references (resource) components.

What problem does it solve? Frappe Desk's default UI often lacks the custom buttons, dynamic field behavior, and interactive dialogs that real business workflows require, and writing client-side scripts without framework knowledge leads to broken events and stale UI state. ## Core Features & Use Cases - Form Scripts: Hook into form events like refresh, validate, and field changes to add custom buttons, filter Link fields, and toggle field visibility. - List View Customization: Add colored status indicators, bulk actions, and custom list behavior via frappe.listview_settings. - Dialogs and Server Calls: Build multi-field dialogs, prompts, and confirmations that call whitelisted server methods with frappe.call or frappe.xcall. - Use Case: Add a "Submit for Review" button to a custom DocType form that only appears in Draft status, calls a server-side API method, and reloads the document on success. ## Quick Start Add a custom button to the Sales Order form in Frappe Desk that calls a server method and shows a confirmation dialog.

Frequently Asked Questions about desk-customization

High-intent search queries and answers about installing and using this skill.

FAQPage Schema
How do I add a custom button to a Frappe form?▼

Use frm.add_custom_button inside the refresh event of frappe.ui.form.on to add a button to a Frappe form. You can group buttons under a label and attach a callback that calls a server method with frappe.call.

How to filter Link field options in Frappe form scripts?▼

Use frm.set_query in the setup event to filter Link field options by returning a filters object. For example, you can restrict a Customer field to only show records where status equals Active.

What is the difference between Client Script and app-level form scripts in Frappe?▼

App-level form scripts live in the app's doctype directory and are version controlled, while Client Scripts are stored in the database per site. Use app-level scripts for reusable app behavior and Client Scripts for site-specific tweaks.

Why is my Frappe form script not loading?▼

Form scripts fail to load when the file path does not match the DocType naming convention or assets were not rebuilt. Run bench build --app your_app and check the browser console for JavaScript errors.

Can I customize a DocType from another Frappe app without modifying it?▼

Yes, use the doctype_js and doctype_list_js hooks in your app's hooks.py to inject custom scripts into another app's DocType. After adding the hook, run bench build to bundle the assets.