Dev Tooling

FPM

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.

Language
Go
License
Apache 2.0
Platforms
Linux · macOS · Windows
Arch
amd64 · arm64
Format
.fpm archive
QUICKSTART
Install
# Linux / macOScurl -fsSL https://raw.githubusercontent.com/vyogotech/fpm/main/install.sh | bash fpm --version
Package & publish
# 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
Install an app
# 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.local

What FPM gives you

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.

Your own package repository

Host an internal registry with HTTP Basic Auth and priority-based resolution across multiple repositories, so proprietary apps stay inside your perimeter.

Integrity verification

Every package carries a checksum that is verified before installation, so what a pipeline built is what a server installs.

Offline and air-gapped 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.

Search across repositories

fpm search resolves across every configured repository by priority, so a private build can shadow a public one deliberately.

Cross-platform binary

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.

Under the hood

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.

Read the source

Frequently asked questions

Why not just use bench get-app?

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.

Can I host a private repository?

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.

What does --site do that --bench-path doesn’t?

--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.

Does it work air-gapped?

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.

Running FPM in production?

We 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