30 Migrating to nightly version
Raffael Meyer edited this page 2026-07-16 17:26:14 +02:00

This page is intended to make it easier for users who maintain custom apps/forks to migrate their installations to develop branch aka the nightly version. This page assumes that you're on v17.x.x-dev


bleach replaced by nh3

If your custom app relies on the bleach library, you'll have to add it to your app's dependencies, as this has been replaced by nh3 in the develop branch. While the actual functionality was backported to v16, the library was left for those that may be reliant on it.

Stricter docstatus validation for non-submittable doctypes

Saving a non-submittable doctype with docstatus=1 now raises a DocstatusTransitionError. If you need to bypass this check, use the new flag:

doc.flags.skip_docstatus_validation = True
doc.save()

Reference: #37009

Only icons in the Lucide icon set are now supported

If you custom app uses icons belonging to either Font Awesome, Octicons, Espresso (es-), or Timeless icons - they need to be changed to relevant icons in Lucide. Use the frappe.utils.icon() helper method in most places instead of direct <svg> tags.

Reference: #40571

get_label returns untranslated source labels

meta.get_label() (Python) and frappe.meta.get_label() (JavaScript) now always return the untranslated English source label. Previously, default field labels (creation, owner, modified, …) were translated inside these helpers, while normal DocField labels were not.

Translate at the presentation boundary instead:

# Before — unreliable: default fields were already translated, DocFields were not
label = meta.get_label(fieldname)

# After
label = _(meta.get_label(fieldname), context=doctype)
// Before — unreliable for the same reason
const label = frappe.meta.get_label(doctype, fieldname);

// After
const label = __(frappe.meta.get_label(doctype, fieldname), null, doctype);

Prefer passing the owning DocType as context so per-DocType Translation overrides keep working.

If you only store labels for later translation (for example report columns), keep calling get_label() without wrapping them.

Default field labels in DEFAULT_FIELD_LABELS are marked with N_() so gettext still extracts them. N_ returns the original string and does not look up a translation.