---
title: "Customization"
space: "Frappe Framework"
url: "https://www.prilk.com/docs/frappe-framework/customization"
updated: "2026-05-14"
---

## 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](/docs/frappe-ecosystem/developers).
