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.5.tar.gz (17.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.5-py3-none-any.whl (17.1 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: brewfile-0.1.5.tar.gz
  • Upload date:
  • Size: 17.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.5.tar.gz
Algorithm Hash digest
SHA256 fa8db2476a6f61da6468617a7bc5a882dc0680f3761c7bd80809415afd5c55fb
MD5 65103b67aa1ac008dcc4472c72087914
BLAKE2b-256 3b3bcde402b895632e2c458785e8e120d12dd98ecadc94f8f61ea7a4d4babadf

See more details on using hashes here.

Provenance

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

Publisher: release.yml on waltermwaniki/homebrew-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.5-py3-none-any.whl.

File metadata

  • Download URL: brewfile-0.1.5-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.5-py3-none-any.whl
Algorithm Hash digest
SHA256 a767ce6395ac50cec90726611dc45fb3b1ad054eaf710177d1d4126ed7b0af82
MD5 5f22914a04d4a99a1bbc990e14f3d2ea
BLAKE2b-256 5deffa4393f3a0368b8e395146ff08bd6d21a097c576a231e721e9de0a55ee8a

See more details on using hashes here.

Provenance

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

Publisher: release.yml on waltermwaniki/homebrew-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