Deployments that don’t need Git
A versioned .fpm file is the deployment unit. No clone step, no branch drift, no outage because a remote was unreachable at the wrong moment.
Dev Tooling
Frappe Package Manager
FPM turns Frappe app deployment from a Git-centric ritual into package management. Build a versioned .fpm artefact, publish it to a repository you control, and install it anywhere — reproducibly, offline, with checksums.
# Linux / macOScurl -fsSL https://raw.githubusercontent.com/vyogotech/fpm/main/install.sh | bash fpm --version# Build a versioned artefact from an app checkoutcd /path/to/your-frappe-appfpm package --version 1.0.0 --org myorg # Point at your repository and publishfpm repo add company-repo https://fpm.company.com --priority 10 --username deployerfpm publish myorg/my-app==1.0.0 --repo company-repo# Find itfpm search myorg/my-app # Add it to a bench, and activate it on a sitefpm install myorg/my-app==1.0.0 \ --bench-path /path/to/bench \ --site mysite.localA versioned .fpm file is the deployment unit. No clone step, no branch drift, no outage because a remote was unreachable at the wrong moment.
Host an internal registry with HTTP Basic Auth and priority-based resolution across multiple repositories, so proprietary apps stay inside your perimeter.
Every package carries a checksum that is verified before installation, so what a pipeline built is what a server installs.
Python dependencies can be bundled into the package for a chosen wheel platform, making installs on a disconnected host a supported path rather than a workaround.
fpm search resolves across every configured repository by priority, so a private build can shadow a public one deliberately.
A single static Go binary for Linux, macOS and Windows on both amd64 and arm64 — the same tool on a laptop and in a build container.
A Go CLI that manages app dependencies independently of Git, producing immutable build artefacts. The --site flag also runs bench install-app, because creating DocTypes and running patches is work only bench can do.
bench get-app resolves a Git ref at install time, so the same command can produce different code on different days and fails when the remote is unavailable. FPM installs a specific, checksummed artefact — the same bytes every time, including on machines with no access to your Git host.
Yes. An FPM repository is an HTTP endpoint with Basic Auth, and the CLI supports multiple repositories with priority ordering so internal packages resolve ahead of public ones.
--bench-path adds the app to the bench. --site additionally runs bench --site <site> install-app, which creates the app's DocTypes and runs its patches. Without it the app is present but not active on any site.
Yes — that is what --bundle-deps is for. Production packages bundle their Python wheels for a target platform, so installation needs no package index at all.
Zero-config Frappe images
Pre-built, single-node Frappe and ERPNext container images that boot with a working site.
ExploreFrappe v16 as a native package
Frappe and ERPNext v16 installed with snap, apt, dnf or brew — no Docker, no bench setup script.
ExploreMulti-tenancy on a single site
A Frappe app that lets one site serve many tenants, isolated by row instead of by database.
ExploreWe build and maintain these tools, and we help teams adopt them. Tell us what you are trying to ship and we will tell you honestly whether this is the right piece.
Talk to the team