Versioning and Custom App Rules

App Versioning Requirements

We’ve recently introduced stricter versioning rules for all Frappe applications. These rules apply equally to Marketplace apps and private/custom apps.

The goal is to ensure predictable compatibility, smoother upgrades, and safer dependency resolution across the ecosystem.

What’s changing

All applications public or private must now:

  1. Use a pyproject.toml file

  2. Declare a bounded Frappe dependency in that file

Required: pyproject.toml

Every app must include a pyproject.toml file in it’s root directory.

Within this file, the app must explicitly declare its bounded Frappe dependency under the following section:

[tool.bench.frappe-dependencies]
frappe = ">=16.0.0-dev <17.0.0-dev"

A bounded version specifies both:

  • a lower bound (minimum supported version), and

  • an upper bound (maximum supported version)

In other words, the dependency must clearly state:

“This app works with Frappe versions from X up to (but not including) Y.”

Why this is required?

Bounded versioning helps us:

  • Prevent apps from being installed on incompatible Frappe versions

  • Avoid unexpected breakages during upgrades

This consistency is especially important for the Marketplace, but private apps are held to the same standard to ensure site updates run reliably.

17 Likes

A little Note:
For semantic checks, multiple restrictions must be separated by commas. A space is there invalid.

Correct example:

[tool.bench.frappe-dependencies]
frappe = ">=16.0.0-dev,<17.0.0-dev"

Not:

[tool.bench.frappe-dependencies]
frappe = ">=16.0.0-dev <17.0.0-dev"
2 Likes

On a lighter note - I like how the system says This is the first time he has posted but under his name its Amazing Contributor :upside_down_face:

1 Like

“** contributor” tags are given for github contributions :smiley:

2 Likes