Title: Migrating from Frappe v15 to Frappe v16 — A Complete, In‑Place Upgrade Guide
Author: Immanuel Raj
Published: November 21, 2025
Last modified: January 19, 2026

---

![3D isometric illustration showing a server migration process, with data flowing
through a glowing blue pathway from an old server rack to a modern high-performance
server tower, symbolizing the Frappe v15 to v16 upgrade.](https://immanuelraj.dev/
wp-content/uploads/2025/11/frappe-version-15-to-beta-1-migration-scaled.jpeg)

# Migrating from Frappe v15 to Frappe v16 — A Complete, In‑Place Upgrade Guide

[November 21, 2025](https://immanuelraj.dev/frappe-v15-to-v16-beta-migration-guide/)

—

by

[Immanuel Raj](https://immanuelraj.dev/author/iamimmanuelraj/)

in [ERPNext](https://immanuelraj.dev/category/erpnext/), [Frappe](https://immanuelraj.dev/category/frappe/)

Read Time

4–6 minutes

Upgrading between major Frappe versions is always a big moment, especially when 
you want a _clean, in-place migration_ without resetting or recreating anything.
With the release of [Frappe Framework v16.0.0](https://github.com/frappe/frappe/releases/tag/v16.0.0),
we finally get the first look at what’s coming — a brand‑new UI, navigation overhaul,
performance upgrades, and several structural changes.

This article covers everything you need to know to migrate safely from **Frappe 
v15 → v16**, including prerequisites, breaking changes, new dependency requirements,
handling custom apps, and installing the new Offsite Backup app. It’s written from
real‑world experience and based entirely on the official changelog and merged pull
requests in the release.

---

## 🔧 Prerequisites Before Migrating

Before switching branches, ensure your system meets the new minimum requirements
introduced in Frappe v16:

### **1. Python 3.14**

Frappe v16 drops support for older Python versions. Your environment will be best
if it run Python 3.14.

### **2. Node.js 24**

Node 22 (or lower) won’t work. Update to **Node.js 24 LTS** before building assets.

### **3. Latest MariaDB / Redis (Recommended)**

Not mandatory but highly recommended for performance and compatibility. Atleast 
mariaDB 10.4 and Redis 8

### **4. Ensure Your Bench is Updated**

    ```wp-block-code
    pip install --upgrade frappe-bench
    ```

---

## 🔥 Highlight Features & Changes in Frappe v16

Before diving in, note that the changes listed below include both highlights from
the official v16 changelog and the improvements I personally consider the most important
and attention‑worthy.
Here are the changes directly extracted and interpreted from
the v16 changelog and PRs.

### **1. SQLite Support — Run Frappe Without a Separate Database**

One of the biggest structural changes in Frappe v16 is **native SQLite support**.

You can now run Frappe with **only SQLite**, without requiring MariaDB.
This completely
changes how lightweight deployments, dev setups, and local experiments can be done.

Benefits:

 * No external DB dependency
 * Faster test environments
 * Easier local development
 * Simplified deployments for small apps

This is **one of the most impactful backend changes in Frappe 16**.

### **2. A Completely New UI & Navigation System**

Frappe v16 ships with a _fully redesigned interface_:

 * New layout structure
 * New menu system
 * New URL routing pattern
 * Cleaner, modular page design

This is the biggest UI jump since v12 → v13.

### **2. Major URL Pattern Changes (Important!)**

The old style URLs change significantly.

A standout improvement:

 * **`#tab_x` URLs now point directly to individual elements**, making deep‑linking
   smoother.

### **3. Events for Table MultiSelect**

The new event system introduced for Table MultiSelect fields adds:

 * Real‑time event hooks
 * Better dynamic behavior
 * Cleaner custom logic

This is especially useful in customization-heavy apps.

### **4. Users Can Now Have Multiple Roles (PR #26394)**

This is a big one.

Previously, assigning multiple roles required creating a **Role Profile** or relying
on workarounds. Now:

 * Users can directly have multiple roles assigned
 * No role profile needed for simple role combinations

This significantly reduces clutter in permissions setups.

### **5. New Image Field Preview (PR #31719)**

The new image preview improvements make media handling smoother.
This benefits:

 * CMS use‑cases
 * E‑commerce
 * Anything involving file/image uploads

### **6. Removal of Google Drive & S3 Backup Integrations**

Frappe has completely removed:

 * Google Drive Backup
 * S3 Backup

These are now moved into a separate official app:
👉 [https://github.com/frappe/offsite_backups](https://github.com/frappe/offsite_backups)

To continue remote backups, you _must_ install this app after migrating.

### **7. Performance Optimizations**

A major portion of the changelog is focused on internal improvements:

 * Faster build times
 * Optimized caching
 * Improved doc-type rendering
 * Reduced desk load operations
 * More efficient API responses

These enhancements collectively make the framework feel significantly smoother.

### **8. Additional Notable Changes from the Changelog**

After reviewing the official release notes for v16.0.0, here are more updates worth
mentioning:

 * Enhanced desk rendering logic and navigation structure
 * More consistent form behavior with updated controllers
 * Improved event handlers across multiple field types
 * Several security fixes and permission cleanup PRs
 * Changes in how sidebar & workspace items load
 * Better error reporting and debugging hooks

While not always visible, these changes contribute directly to better stability 
and developer experience.**
A large portion of merged PRs focus on:

 * Query optimization
 * Faster server‑side operations
 * Improved desk performance
 * Reduction of redundant calls

This is not just a UI release — there is real backend improvement.

---

## 🧩 Custom Apps — Important Migration Notes

If your bench has custom apps, pay extra attention.

### **1. Update the Frappe Dependency in Each App**

Inside every custom app’s `setup.py` or `pyproject.toml`, update:

    ```wp-block-code
    frappe>=16.0.0
    ```

If your app depends on `frappe>=15`, the migration **will break**.

### **2. Install Releases for Other Frappe Apps**

Frappe also released v16 for:

 * **ERPNext**
 * **HRMS**

If your site depends on these, install/upgrade them _before_ switching branches.

Example:

    ```wp-block-code
    bench get-app erpnext --branch version-16
    bench get-app hrms --branch version-16
    ```

### **3. Validate Custom Scripts & Patches**

With the new UI and URLs, review:

 * Custom JS scripts
 * Page overrides
 * Link formats
 * URL-based routing

Anything touching the Desk may require updates.

---

## 🛠️ Migration Steps — v15 → v16 (In‑Place, No Reset)

Here is the cleanest method to migrate _without resetting or recreating anything_.

### **Step 1: Take a Full Backup**

    ```wp-block-code
    bench backup --with-files
    ```

### **Step 2: Upgrade Python & Node (if needed)**

Reinstall environment with Python 3.12:

    ```wp-block-code
    pyenv install 3.14.x  # or system install
    ```

Upgrade Node:

    ```wp-block-code
    n# (Node version manager)
    n install 24
    ```

### **Step 3: Update Dependencies of Custom Apps**

Update the Frappe requirement in the app config files.

### **Step 4: Switch Frappe Branch to v16**

    ```wp-block-code
    bench switch-to-branch version-16 frappe --upgrade
    ```

If using ERPNext or HRMS:

    ```wp-block-code
    bench switch-to-branch version-16 erpnext --upgrade
    bench switch-to-branch version-16 hrms --upgrade
    ```

### **Step 5: Install Offsite Backup App**

Since v16 removes GDrive & S3 backups:

    ```wp-block-code
    bench get-app https://github.com/frappe/offsite_backups
    bench --site yoursite.com install-app offsite_backups
    ```

### **Step 6: Run Migrate**

    ```wp-block-code
    bench update --patch
    bench migrate
    ```

### **Step 7: Build Assets**

    ```wp-block-code
    bench build
    ```

### **Step 8: Restart Services**

    ```wp-block-code
    bench restart
    ```

---

---

## 🎉 Final Thoughts

Migrating to **Frappe v16** is more than a version upgrade — it’s stepping into 
an entirely new UI and navigation system. The improvements in permissions, performance,
URL structure, and developer ergonomics make it a significant milestone.

If you follow the steps above — updating dependencies, installing the new backup
app, and switching branches properly — you can complete the migration **without 
wiping or recreating your site**.

Once stable releases arrive, the ecosystem around v16 will become even more polished.
Until then, enjoy exploring and all the new capabilities it offers.
[Read about adding custom reset template for frappe](https://immanuelraj.dev/customize-frappe-reset-password-template/)
[Read about my custom app to harden frappe login](https://immanuelraj.dev/block-administrator-support/)

[Frappe](https://immanuelraj.dev/tags/frappe/) [frappe-framework](https://immanuelraj.dev/tags/frappe-framework/)
[migration](https://immanuelraj.dev/tags/migration/) [v15](https://immanuelraj.dev/tags/v15/)
[v16](https://immanuelraj.dev/tags/v16/)

[Previous:  Object Cache | Page Cache | OP Cache – Caching for WordPress](https://immanuelraj.dev/wordpress-caching-opcache-object-page-optimization/)

[Next:  Hetzner Email, Cloudflare DNS: The Ultimate Setup Guide](https://immanuelraj.dev/hetzner-mail-cloudflare-dns-setup/)

![Immanuel Raj Avatar](https://secure.gravatar.com/avatar/88db6e1fa27cf854075acbaa156189ace30cf3701b2d8640cd774280ead1d4d3?
s=80&d=mm&r=g)

## About the author

Software Developer & Technology Consultant

---

## Popular Categories

 * [Bible](https://immanuelraj.dev/category/bible/) (1)
 * [Cloudflare](https://immanuelraj.dev/category/cloudflare/) (1)
 * [Databases](https://immanuelraj.dev/category/databases/) (1)
 * [Docker](https://immanuelraj.dev/category/docker/) (1)
 * [Email](https://immanuelraj.dev/category/email/) (1)
 * [ERPNext](https://immanuelraj.dev/category/erpnext/) (3)
 * [Frappe](https://immanuelraj.dev/category/frappe/) (2)
 * [Github Actins](https://immanuelraj.dev/category/github-actins/) (1)
 * [God](https://immanuelraj.dev/category/god/) (1)
 * [Google Cloud](https://immanuelraj.dev/category/gcp/) (1)
 * [Hosting](https://immanuelraj.dev/category/hosting/) (2)
 * [Life](https://immanuelraj.dev/category/life/) (1)
 * [Linux](https://immanuelraj.dev/category/linux/) (13)
 * [ML](https://immanuelraj.dev/category/ml/) (1)
 * [Networking](https://immanuelraj.dev/category/networking/) (2)
 * [Security](https://immanuelraj.dev/category/security/) (2)
 * [Self Hosting](https://immanuelraj.dev/category/self-hosting/) (7)
 * [SSL](https://immanuelraj.dev/category/ssl/) (3)
 * [Terminal](https://immanuelraj.dev/category/terminal/) (1)
 * [Tools](https://immanuelraj.dev/category/tools/) (2)
 * [Uncategorized](https://immanuelraj.dev/category/uncategorized/) (8)
 * [Web](https://immanuelraj.dev/category/web/) (2)
 * [WordPress](https://immanuelraj.dev/category/wordpress/) (1)

---

## Useful Links

Links I found useful and wanted to share.

 * [Sponsor Me](https://github.com/sponsors/iamimmanuelraj)

---

## Search the website

Search