A cross-platform CLI tool that automates the installation of development and cybersecurity tools after a fresh OS install.
- π― Pre-made tool sets - Choose from curated sets of development or cybersecurity tools
- π οΈ Custom configurations - Create your own sets or use custom config files
- π Unified package search - Search across all selected managers simultaneously with multi-select support
- π Cross-platform sets - Define sets that work on Windows, Linux, or both with OS-specific manager preferences
- π¦ Multiple package managers - Supports apt, yum, pacman, winget, chocolatey, scoop, snap, and flatpak
- π― Smart manager selection - Automatically uses preferred package managers with intelligent fallback
- β¨ Beautiful CLI - Clean, intuitive interface with progress indicators and helpful feedback
- π¨ Custom color scheme - Elegant purple and cyan theme
- β‘ Fast installation - Automatically detects and uses the best package manager for each tool
- β Package validation - Verify package names before installation
- π€ Export functionality - Export sets to native package manager formats (Winget JSON, Chocolatey XML, etc.)
- π Update support - Check for installed packages and update them when available
- π Set information - View detailed information about sets including OS compatibility and manager preferences
- Python 3.8 or higher
- One or more supported package managers installed on your system
We recommend installing Blacksmith in a virtual environment to avoid PATH issues and ensure proper isolation.
1. Create a virtual environment:
Linux/macOS:
python3 -m venv ~/.blacksmith-venv
source ~/.blacksmith-venv/bin/activateWindows (PowerShell):
python -m venv $env:USERPROFILE\.blacksmith-venv
$env:USERPROFILE\.blacksmith-venv\Scripts\Activate.ps1Windows (CMD):
python -m venv %USERPROFILE%\.blacksmith-venv
%USERPROFILE%\.blacksmith-venv\Scripts\activate.bat2. Install Blacksmith:
Option A: Install from PyPI (recommended)
pip install jdi-blacksmithOption B: Install from source
git clone https://github.com/jimididit/blacksmith.git
cd blacksmith
pip install -e .3. Verify installation:
blacksmith --version4. Using Blacksmith:
After installation, make sure your virtual environment is activated. To activate it again later:
Linux/macOS:
source ~/.blacksmith-venv/bin/activateWindows (PowerShell):
$env:USERPROFILE\.blacksmith-venv\Scripts\Activate.ps1Windows (CMD):
%USERPROFILE%\.blacksmith-venv\Scripts\activate.batOptional: Create an alias for easier access:
Linux/macOS (~/.bashrc or ~/.zshrc):
alias blacksmith="$HOME/.blacksmith-venv/bin/blacksmith"Windows (PowerShell Profile):
Set-Alias blacksmith "$env:USERPROFILE\.blacksmith-venv\Scripts\blacksmith.exe"If you prefer not to use a virtual environment, you can install directly:
# From PyPI
pip install jdi-blacksmith
# Or from source
git clone https://github.com/jimididit/blacksmith.git
cd blacksmith
pip install -e .
β οΈ Note: Installing without a virtual environment may cause PATH issues. Ifblacksmithis not recognized after installation, you may need to add Python's Scripts/bin directory to your PATH. See the Troubleshooting Installation section below.
π‘ Having installation issues? See the Troubleshooting Installation section below.
# Interactive mode (shows menu)
blacksmith
# List available sets with OS compatibility
blacksmith list
# View detailed set information
blacksmith info <set_name>
# Install a set
blacksmith install <set_name>
# Create a custom set
blacksmith create
# Search for packages
blacksmith search <query> [--manager <name>]
# Export set to native format
blacksmith export <set_name> --format <format>
# Validate a config file
blacksmith validate <path>
# Uninstall Blacksmith
blacksmith uninstallThe easiest way to use Blacksmith is through the interactive menu:
blacksmithThis will display a beautiful banner and an interactive menu to select and install tool sets.
View all available sets with OS compatibility indicators:
blacksmith listThe list shows:
- Set name and description
- OS compatibility badges (πͺ Windows, π§ Linux, π macOS)
- Preferred package managers
- Package count
- Compatibility status with your current OS
# List available sets
blacksmith list
# Install a specific set
blacksmith install development
blacksmith install cybersecurity
blacksmith install minimalblacksmith install --file path/to/your-config.yaml# Standard mode (cross-platform, multi-manager)
blacksmith create
# Advanced mode (single-OS, single-manager sets)
blacksmith create --advancedThis launches an interactive wizard to create a custom tool set configuration. The wizard includes:
- OS selection: Choose Windows, Linux, or both for cross-platform sets
- Manager selection: Select which package managers to target for each OS
- Unified search: Search across all selected managers simultaneously - see results from all managers at once
- Multi-select: Select packages from multiple managers in one go using checkboxes
- Smart grouping: Automatically groups the same package from different managers
- Real-time validation: Verify package names before adding them
- Export ready: Sets are saved with OS compatibility and manager preferences for optimal installation
Search for packages across all available package managers:
# Search across all managers
blacksmith search docker
# Search in a specific package manager (supports aliases)
blacksmith search git --manager winget
blacksmith search git --manager choco # Alias for chocolatey
# Limit results
blacksmith search python --limit 5Features:
- Real-time results: Queries each package manager directly for up-to-date results
- Manager aliases: Use
chocoforchocolatey,dnfforyum, etc. - OS-aware errors: Clear messages when requesting OS-specific managers (e.g.,
apton Windows) - Unified display: Results grouped by manager with descriptions
This is especially useful when creating custom sets, as it ensures you use the correct package names for each package manager.
Get detailed information about a set, including OS compatibility and manager preferences:
# View info about a pre-made set
blacksmith info development
blacksmith info cybersecurity
# View info about a custom config file
blacksmith info --file path/to/config.yamlExport sets to native package manager formats for use outside of Blacksmith:
# Export to Winget JSON format
blacksmith export development --format winget
# Export to Chocolatey packages.config
blacksmith export development --format chocolatey
# Export to Apt text list
blacksmith export development --format apt
# Export with custom output file
blacksmith export development --format winget --output my-packages.jsonSupported formats:
winget- JSON array of package IDschocolatey/choco- XML packages.config formatapt- Plain text listpacman- Plain text listscoop- JSON array
blacksmith validate path/to/config.yaml# Skip already installed packages
blacksmith install development --skip-installed
# Prefer a specific package manager (overrides set preferences)
blacksmith install development --prefer winget
# Force installation even if OS doesn't match set's target_os
blacksmith install development --force# Using the CLI (removes package and virtual environment)
blacksmith uninstall
# Skip confirmation prompt
blacksmith uninstall --yesThe uninstall command will:
- Remove Blacksmith from your Python environment
- Remove the virtual environment (if installed via
venvmethod) - Clean up the
blacksmithcommand executable
Blacksmith uses YAML configuration files with support for cross-platform sets. Here's an example:
name: "My Custom Set"
description: "My favorite development tools"
packages:
- name: git
managers:
apt: git
pacman: git
winget: Git.Git
chocolatey: git
scoop: git
- name: docker
managers:
apt: docker.io
pacman: docker
yum: docker
winget: Docker.DockerDesktopname: "Cross-Platform Dev Tools"
description: "Development tools for Windows and Linux"
target_os: ["windows", "linux"] # OS compatibility
preferred_managers: # Manager preferences per OS
windows: ["winget", "chocolatey"]
linux: ["apt", "flatpak"]
managers_supported: # Limit to specific managers
- winget
- chocolatey
- apt
- flatpak
packages:
- name: git
managers:
winget: Git.Git
chocolatey: git
apt: git
flatpak: org.gnome.gitgConfiguration Fields:
name(required) - Set namedescription(optional) - Set descriptiontarget_os(optional) - List of target OSes:["windows"],["linux"], or["windows", "linux"]preferred_managers(optional) - Dictionary mapping OS to preferred manager ordermanagers_supported(optional) - List of managers to limit installation topackages(required) - List of packages with manager-specific IDs
- apt - Debian/Ubuntu
- yum/dnf - RHEL/Fedora
- pacman - Arch Linux
- snap - Universal Linux packages
- flatpak - Application sandboxing
- winget - Windows Package Manager
- chocolatey - Windows package manager
- scoop - Command-line installer
Smart Manager Selection:
Blacksmith automatically detects which package managers are available on your system and uses intelligent selection:
- Preference-based: Uses
preferred_managersfrom the set configuration if specified - OS-specific defaults: Falls back to sensible defaults (e.g.,
winget>chocolatey>scoopon Windows) - Fallback logic: If preferred manager isn't available, tries the next one in order
- OS compatibility: Checks if the set is compatible with your OS (can be overridden with
--force) - Manager filtering: Respects
managers_supportedto limit which managers are considered
macOS support is planned for a future release. While the codebase includes some macOS compatibility (OS detection, install scripts), full support is not yet available.
Planned features for macOS:
- Homebrew package manager integration
- MacPorts support (optional)
- Native macOS package installation workflows
- Full compatibility with macOS-specific tool installations
If you're interested in contributing macOS support, please check out our Contributing section or open an issue to discuss!
Essential development tools including Git, Docker, VS Code, Python, Node.js, and more.
Security and penetration testing tools including Nmap, Wireshark, Metasploit, Burp Suite, and more.
Lightweight setup with just the essentials: Git, curl, and Vim.
# Clone the repository
git clone https://github.com/jimididit/blacksmith.git
cd blacksmith
# Create a virtual environment
python -m venv venv
# Activate it
# On Linux/Mac:
source venv/bin/activate
# On Windows:
venv\Scripts\activate
# Install in development mode
pip install -e .
# Install development dependencies (for testing and code quality)
pip install pytest pytest-cov pytest-mock ruff black mypy yamllintblacksmith/
βββ blacksmith/
β βββ cli.py # Main CLI interface
β βββ config/ # Configuration system
β β βββ loader.py # Config file loading
β β βββ parser.py # YAML parsing
β β βββ preferences.py # Manager preference system
β β βββ validator.py # Config validation
β βββ export/ # Export functionality
β β βββ base.py # Base exporter class
β β βββ winget.py # Winget JSON exporter
β β βββ chocolatey.py # Chocolatey XML exporter
β β βββ apt.py # Apt list exporter
β β βββ pacman.py # Pacman list exporter
β β βββ scoop.py # Scoop JSON exporter
β βββ package_managers/ # Package manager implementations
β βββ sets/ # Pre-made tool sets
β βββ utils/ # Utility modules
β βββ os_detector.py # OS detection
β βββ ui.py # UI helpers (Rich)
βββ tests/ # Test suite
βββ scripts/ # Helper scripts
β βββ bump_version.py # Version bumping script
βββ README.md
Blacksmith uses Semantic Versioning (SemVer): MAJOR.MINOR.PATCH
- PATCH (0.1.0 β 0.1.1): Bug fixes, security patches
- MINOR (0.1.0 β 0.2.0): New features (backward compatible)
- MAJOR (0.2.0 β 1.0.0): Breaking changes, first stable release
Quick version bump:
# Bump patch version (0.1.0 -> 0.1.1)
python scripts/bump_version.py --patch
# Bump minor version (0.1.0 -> 0.2.0)
python scripts/bump_version.py --minor
# Bump major version (0.1.0 -> 1.0.0)
python scripts/bump_version.py --major
# Or set a specific version
python scripts/bump_version.py 0.1.1Manual version update:
Update the version in both pyproject.toml and blacksmith/__init__.py, then:
git tag -a v0.1.1 -m "Release version 0.1.1"
git push origin v0.1.1Contributions are welcome! Please feel free to submit a Pull Request. For major changes, please open an issue first to discuss what you would like to change.
- Fork the repository
- Clone your fork:
git clone https://github.com/your-username/blacksmith.git - Create a feature branch:
git checkout -b feature/AmazingFeature - Set up your development environment (see the Development section above)
- Make your changes
- Run tests locally (see Testing below)
- Ensure code quality checks pass (see Code Quality below)
- Commit your changes:
git commit -m 'Add some AmazingFeature' - Push to your fork:
git push origin feature/AmazingFeature - Open a Pull Request
Before submitting a PR, please ensure all tests pass:
# Install test dependencies
pip install pytest pytest-cov pytest-mock
# Run all tests
pytest tests/ -v
# Run with coverage
pytest tests/ -v --cov=blacksmith --cov-report=term
# Run specific test file
pytest tests/test_cli.py -vWe use several tools to maintain code quality. Please ensure your code passes these checks:
# Install development dependencies
pip install ruff black mypy yamllint
# Linting (check for errors)
ruff check blacksmith/
# Formatting (check if code is formatted)
ruff format --check blacksmith/
# Auto-fix linting issues
ruff check --fix blacksmith/
# Auto-format code
ruff format blacksmith/
# Type checking
mypy blacksmith/ --ignore-missing-imports
# YAML linting
yamllint blacksmith/sets/*.yamlTo add support for a new package manager:
- Create a new file in
blacksmith/package_managers/(e.g.,brew.py) - Inherit from
PackageManagerbase class inblacksmith/package_managers/base.py - Implement required methods:
is_available()- Check if the package manager is installedinstall(packages)- Install packagesis_installed(package)- Check if a package is installedsearch(query)- Search for packagesupdate_package(package)- Update a single package (optional but recommended)
- Register it in
blacksmith/package_managers/detector.py - Add it to the default preferences in
blacksmith/config/preferences.pyif applicable - Add tests in
tests/test_package_managers.py
To add a new pre-made tool set:
- Create a new YAML file in
blacksmith/sets/(e.g.,gaming.yaml) - Follow the existing format (see
blacksmith/sets/development.yamlfor reference) - Include package names for all supported package managers
- Optionally add cross-platform fields:
target_os- List of target OSes (e.g.,["windows", "linux"])preferred_managers- OS-specific manager preferencesmanagers_supported- Limit to specific managers
- Ensure YAML syntax is valid:
yamllint blacksmith/sets/gaming.yaml - Test loading the set:
blacksmith listshould show your new set - Test the
infocommand:blacksmith info gamingshould display correctly
When reporting bugs, please include:
- Operating system and version
- Python version
- Blacksmith version (
blacksmith --version) - Steps to reproduce
- Expected vs actual behavior
- Error messages or logs (if applicable)
For feature requests, please:
- Open an issue describing the feature
- Explain the use case and benefits
- Discuss implementation approach (if you have ideas)
- Consider contributing the feature yourself!
- Follow PEP 8 style guide
- Use type hints where possible
- Write docstrings for all functions and classes
- Keep functions focused and small
- Add comments for complex logic
- Use meaningful variable and function names
If blacksmith is not recognized after installation, it's likely a PATH issue:
Linux/macOS (with --user install):
# Add to your ~/.bashrc, ~/.zshrc, or ~/.profile:
export PATH="$HOME/.local/bin:$PATH"
# Then reload your shell:
source ~/.bashrc # or source ~/.zshrcWindows (with --user install):
# Find your user Scripts directory:
python -m site --user-base
# Add it to PATH (replace with your actual path):
# Typically: %USERPROFILE%\AppData\Roaming\Python\Python3X\Scripts
# Or: %LOCALAPPDATA%\Programs\Python\Python3X\Scripts
# Then restart your terminalUse a Virtual Environment (Recommended)
Using a virtual environment is the most reliable option and avoids PATH issues:
# Create and activate a virtual environment
python3 -m venv ~/.blacksmith-venv
# Activate it:
# Linux/macOS:
source ~/.blacksmith-venv/bin/activate
# Windows (PowerShell):
$env:USERPROFILE\.blacksmith-venv\Scripts\Activate.ps1
# Windows (CMD):
%USERPROFILE%\.blacksmith-venv\Scripts\activate.bat
# Install blacksmith
pip install jdi-blacksmith
# Now blacksmith will work as long as the venv is activated
blacksmith --versionIf you get permission errors when installing globally:
Linux/macOS:
# Use sudo (not recommended for security):
sudo pip install jdi-blacksmith
# Better: Use --user flag (no sudo needed):
pip install --user jdi-blacksmithWindows:
# Run PowerShell as Administrator, then:
pip install jdi-blacksmith
# Better: Use --user flag (no admin needed):
pip install --user jdi-blacksmithIf installation succeeds but the command isn't found:
-
Check if it's installed:
python -m blacksmith --version
-
Find where pip installed the script:
# Linux/macOS: python -m site --user-base # Then check: <path>/bin/blacksmith # Windows: python -m site --user-base # Then check: <path>\Scripts\blacksmith.exe
-
Verify the entry point:
pip show jdi-blacksmith # Look for "Location:" and "Entry-points:"
This project is licensed under the Apache 2.0 License - see the LICENSE file for details.
jimididit
- GitHub: @jimididit
- Instagram: @jimididit
- YouTube: @jimididit
- TikTok: @jimididit
- Website: www.jimididit.com
- Discord: NΓKTURNAL COMMUNITY
- Built with Click for CLI framework
- Beautiful terminal output powered by Rich
- Interactive prompts with Questionary
β If you find this project helpful, please consider giving it a star on GitHub!