Skip to main content

Intelligent Homebrew package management using brew bundle with JSON configuration and machine-aware installations

Project description

Brewfile - Intelligent Homebrew Package Management

Brewfile is a command-line tool that provides intelligent Homebrew package management using brew bundle with JSON configuration and machine-aware installations.

Features

  • Machine-aware configurations: Different package sets for different machines
  • Package groups: Organize packages into logical groups (e.g., "development", "media", "work")
  • Intelligent sync operations: Install missing packages, remove extras, or adopt system packages
  • Interactive workflows: Safe operations with confirmations
  • Full Homebrew support: Formulas, casks, taps, and Mac App Store apps
  • Type-safe operations: Automatic package type detection with manual overrides
  • Status reporting: Clear visibility into what's installed, missing, or extra

Installation

From PyPI (Recommended)

pip install brewfile

From Source

git clone https://github.com/waltermwaniki/brewfile.git
cd brewfile
uv sync
uv run brewfile --help

Quick Start

  1. Initialize configuration:

    brewfile init
    
  2. Check current status:

    brewfile status
    
  3. Add packages:

    brewfile add neovim
    brewfile add --cask visual-studio-code
    
  4. Sync your system:

    brewfile sync-adopt    # Safe: installs missing, adopts extras
    brewfile sync-cleanup  # Removes extra packages (destructive)
    

Configuration

Brewfile uses a JSON configuration file at ~/.config/brewfile.json:

{
  "version": "1.0",
  "packages": {
    "development": {
      "taps": ["homebrew/cask-fonts"],
      "brews": ["git", "neovim", "python"],
      "casks": ["visual-studio-code", "docker"],
      "mas": ["Xcode::497799835"]
    },
    "media": {
      "brews": ["ffmpeg", "youtube-dl"],
      "casks": ["vlc", "spotify"]
    }
  },
  "machines": {
    "work-laptop": ["development"],
    "personal-mac": ["development", "media"]
  }
}

Commands

Core Commands

  • brewfile init - Initialize configuration with current system packages
  • brewfile status - Show package status and synchronization state
  • brewfile add <package> - Add package to configuration and install
  • brewfile remove <package> - Remove package from system and configuration
  • brewfile edit - Open configuration file in editor

Sync Commands

  • brewfile sync-adopt - Install missing packages + adopt extra packages to config (safe)
  • brewfile sync-cleanup - Install missing packages + remove extra packages (destructive)

Interactive Mode

Run brewfile without arguments to enter interactive mode with guided workflows.

Advanced Usage

Package Types

Brewfile automatically detects package types, but you can force specific types:

brewfile add --cask chrome        # Force as cask
brewfile add neovim               # Auto-detect (formula)

Machine-Specific Configurations

Configure different package sets for different machines by hostname:

{
  "machines": {
    "work-macbook": ["development", "work-tools"],
    "personal-imac": ["development", "gaming", "media"]
  }
}

Mac App Store Apps

Include Mac App Store apps with app IDs:

brewfile add "Xcode::497799835"   # Format: AppName::AppID

Configuration Management

Package Groups

Organize packages into logical groups:

  • development: Development tools and languages
  • media: Audio/video tools and entertainment
  • work: Work-specific applications
  • gaming: Games and gaming tools

Dotfiles Integration

Brewfile works exceptionally well with dotfiles management systems! 🔗

For multi-machine synchronization:

  1. Store your config in dotfiles: Add ~/.config/brewfile.json to your dotfiles repository
  2. Symlink on new machines: Your dotfiles manager can symlink the config automatically
  3. Machine-aware setup: Different machines automatically get their appropriate package groups
  4. One command setup: Run brewfile sync-adopt on a new machine to get all your tools
# Example dotfiles setup
# In your dotfiles repo:
~/dotfiles/config/brewfile.json -> ~/.config/brewfile.json

# On a new machine after dotfiles setup:
brewfile sync-adopt  # Installs all packages for this machine

This approach ensures consistent development environments across all your machines while respecting machine-specific needs (e.g., work laptop vs. personal desktop).

Best Practices

  1. Keep packages in appropriate groups
  2. Use machine-specific configurations for different setups
  3. Store your brewfile config in your dotfiles repository
  4. Regularly run brewfile status to maintain sync
  5. Use sync-adopt for safe operations, sync-cleanup when you need to clean up

Requirements

  • macOS (Homebrew is macOS-specific)
  • Python 3.9 or higher
  • Homebrew installed
  • Optional: mas for Mac App Store apps

License

MIT License - see LICENSE file for details.

Contributing

  1. Fork the repository
  2. Create a feature branch
  3. Make your changes
  4. Add tests if applicable
  5. Submit a pull request

Support

If you encounter issues or have questions:

  1. Check existing GitHub Issues
  2. Create a new issue with details about your problem
  3. Include your configuration file (with sensitive data removed)

Happy brewing! 🍺

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

brewfile-0.1.1.tar.gz (14.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

brewfile-0.1.1-py3-none-any.whl (17.1 kB view details)

Uploaded Python 3

File details

Details for the file brewfile-0.1.1.tar.gz.

File metadata

  • Download URL: brewfile-0.1.1.tar.gz
  • Upload date:
  • Size: 14.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for brewfile-0.1.1.tar.gz
Algorithm Hash digest
SHA256 f728917a2a874edbd0485c16a4c74aea20ed516dade46d699ad6b5881bac21c8
MD5 386efee6ef5b4b09fff71c334af1f43b
BLAKE2b-256 3cce8876d1b6d5fd47e7fe1d41be7e5585c28f10cc531485ed0cf16b241221e5

See more details on using hashes here.

Provenance

The following attestation bundles were made for brewfile-0.1.1.tar.gz:

Publisher: release.yml on waltermwaniki/brewfile

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file brewfile-0.1.1-py3-none-any.whl.

File metadata

  • Download URL: brewfile-0.1.1-py3-none-any.whl
  • Upload date:
  • Size: 17.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for brewfile-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 27a31df3ca6db126351fb3364efe488fb4e95bdf199bcde04cdae21df59a00cd
MD5 e04b9d47778636ee15f83e7f5b968755
BLAKE2b-256 e1f3c20355b83f5338f0f073521fc25bef648e099ce65d109d689813df77e09a

See more details on using hashes here.

Provenance

The following attestation bundles were made for brewfile-0.1.1-py3-none-any.whl:

Publisher: release.yml on waltermwaniki/brewfile

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page