▸ brew bundle — but for apt

Declarative packages
for Debian & Ubuntu.

Define your system dependencies once in an Aptfile. Install, sync, and audit them with a single command — idempotently, every time.

Install
$ curl -fsSL https://raw.githubusercontent.com/apt-bundle/apt-bundle/main/install.sh | sudo bash
Run
$ sudo apt-bundle

See it in action

One Aptfile. One command. Your packages, repos, and keys — all applied.

Aptfile
# Core tools
apt build-essential
apt curl
apt git
apt vim
 
# Pin a version
apt "nano=2.9.3-2"
 
# PHP from PPA
ppa ppa:ondrej/php
apt php8.3
 
# Docker
key https://download.docker.com/linux/ubuntu/gpg
deb "[arch=amd64] https://..."
apt docker-ce
Output
$ sudo apt-bundle
 
→ Processing keys...
docker GPG key added
 
→ Processing PPAs...
ppa:ondrej/php added
 
→ Updating package lists...
Hit:1 http://archive.ubuntu.com ...
 
→ Installing packages...
build-essential (already installed)
curl (already installed)
git → installing...
php8.3 → installing...
docker-ce → installing...
 
✓ Done. 5 installed, 2 already present.

Built for real workflows

Everything you need to manage system dependencies without the complexity.

📦

Declarative

One Aptfile describes your entire system dependency set. Commit it to git and share it.

🔄

Idempotent

Safe to run repeatedly. Already-installed packages are skipped without error.

🔑

Repos & Keys

Add PPAs, custom apt repositories, and GPG keys — all from the same file.

📌

Version Pinning

Pin any package to a specific version with simple quoted syntax.

🔀

Sync

apt-bundle sync installs missing packages and removes ones no longer in the Aptfile.

🚀

GitHub Actions

Native action with built-in caching and lockfile support for reproducible CI builds.

🩺

Doctor & Check

Validate your Aptfile and environment before applying. Machine-friendly JSON output for CI.

📤

Dump

Generate an Aptfile from your current system's installed packages in one command.

Command reference

All subcommands at a glance. See full docs for flags and examples.

Command Description
sudo apt-bundle Install all packages, repos, and keys from the Aptfile
apt-bundle sync Install missing + remove packages no longer in the Aptfile
apt-bundle check Exit 0 only if all Aptfile entries are satisfied; JSON flag for CI
apt-bundle dump Print an Aptfile from currently-installed packages
apt-bundle outdated List packages with available upgrades (exit 1 if any)
apt-bundle doctor Validate the Aptfile and check environment prerequisites
apt-bundle cleanup Remove packages tracked by apt-bundle but no longer in the Aptfile

Why not just a shell script?

Idempotency is hard to get right. Repository and key management is error-prone. Scripts grow unmaintainable.

apt-bundle gives you a single declarative file and predictable behavior every time — no YAML, no DSL, no config management paradigm to learn. It works with your existing apt ecosystem, handles the fiddly bits, and gets out of your way.