Customization
Frappe is built to be customised without forking core. Almost everything can be changed from the desk by an administrator.
Custom Field
Add fields to any DocType without code. Customize Form → DocType → add field. The field is stored in tabCustom Field and survives upgrades. Most Prilk apps ship custom fields this way.
Customize Form
Reorder fields, change labels, hide fields per role, set required-on-condition. Same dialog as Custom Field. Changes apply globally to that DocType.
Property Setter
Override a single property of a field — its default value, mandatory flag, or read-only state — without touching the DocType definition. Created automatically when you Customize Form.
Client Script
JavaScript that runs on a DocType's form in the browser. Triggers like refresh, validate, on field change. Use for: dynamic field visibility, computed values, custom buttons.
Server Script
Python that runs on a DocType's lifecycle events server-side (before_save, on_submit, scheduled). Use for: validation, integrations, automated workflows. Sandboxed for safety.
Custom DocType
Build your own data model from the desk. Define fields, permissions, naming rules. The DocType becomes a queryable table with auto-generated form and list view. No code required.
When to write an app instead
If your customization grows beyond a few Custom Fields and Server Scripts — or you need it across multiple sites — package it as a Frappe app. See Developers.