Build

A new machine is one command from a running app.

config/deps.ts declares the system tools a project needs, the way package.json declares its JavaScript. Pantry installs them into the project rather than globally, so two apps on one laptop can want different versions of the same database, and CI gets exactly what development had.

What you get.

All of it in the same install, with nothing to wire together first.

Declared, not documented

Bun, Git, the database engine, the mail server, Redis: whatever config/deps.ts names is installed at the version range it names, instead of a README step someone skips.

Per project

Tools install into the project, not system-wide, so one app on one Postgres and another on the next major coexist on the same machine.

Database, started and migrated

Pantry provisions the database the app is configured for, starts it, then runs buddy migrate and buddy seed, so a fresh clone opens with data in it.

Follows your .env

buddy setup rewrites the dependency list for the database DB_CONNECTION names, so only the engine you actually use gets installed.

Same versions everywhere

pantry.lock pins every tool and CI installs from it, failing the build if the lock no longer describes the tree, so version drift is caught before a deploy.

A large registry

Around 3,500 packages, from databases and search engines to compilers and CLIs, through one installer and one lockfile.

From the command line.

Buddy scaffolds, runs, and ships this the same way it does the rest of the app.

curl -fsSL https://pantry.dev | bash pantry install buddy setup

These share the same models, config, and types, so using them together costs nothing extra.