{"id":31274097,"url":"https://github.com/georgik/espbrew","last_synced_at":"2025-09-23T22:36:12.730Z","repository":{"id":315584368,"uuid":"1057685377","full_name":"georgik/espbrew","owner":"georgik","description":"Tool for building ESP projects for multiple targets","archived":false,"fork":false,"pushed_at":"2025-09-19T12:48:26.000Z","size":41,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-09-19T13:29:33.629Z","etag":null,"topics":["build","esp32","kconfig","rust"],"latest_commit_sha":null,"homepage":"https://georgik.github.io/espbrew/","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/georgik.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-09-16T04:35:07.000Z","updated_at":"2025-09-19T12:48:29.000Z","dependencies_parsed_at":"2025-09-19T13:29:37.522Z","dependency_job_id":"1a361d1f-d405-487d-a384-b3ef5c46aaa2","html_url":"https://github.com/georgik/espbrew","commit_stats":null,"previous_names":["georgik/espbrew"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/georgik/espbrew","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/georgik%2Fespbrew","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/georgik%2Fespbrew/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/georgik%2Fespbrew/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/georgik%2Fespbrew/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/georgik","download_url":"https://codeload.github.com/georgik/espbrew/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/georgik%2Fespbrew/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":276662038,"owners_count":25682025,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-09-23T02:00:09.130Z","response_time":73,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["build","esp32","kconfig","rust"],"created_at":"2025-09-23T22:36:11.395Z","updated_at":"2025-09-23T22:36:12.719Z","avatar_url":"https://github.com/georgik.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 🍺 ESPBrew - ESP32 Multi-Board Build Manager\n\nA TUI (Terminal User Interface) and CLI tool for managing ESP-IDF builds across multiple board configurations. It automatically discovers board configurations, generates build scripts, and provides real-time build monitoring.\n\n![ESP32 Multi-Board Support](https://img.shields.io/badge/ESP32-Multi--Board-blue)\n![Rust](https://img.shields.io/badge/rust-1.70+-orange.svg)\n![License](https://img.shields.io/badge/license-MIT-green.svg)\n\n## ✨ Features\n\n### Multi-Board Management\n- Auto-Discovery: Automatically finds all `sdkconfig.defaults.*` configurations\n- Board-Specific Builds: Each board gets its own build directory (`build.{board_name}`)\n- Target Detection: Automatically detects ESP32 target (S3, P4, C6, C3) from config files\n- Parallel Builds: Builds all boards simultaneously\n\n### Component Management\n- Component Discovery: Automatically finds components in `components/` and `managed_components/` directories\n- Visual Indicators: Distinguishes between local (🔧) and managed (📦) components\n- Component Actions: Move, clone from repository, remove, or open in editor\n- Smart Repository Cloning: Automatically converts `git://` URLs to `https://` for compatibility\n- Manifest Parsing: Reads `idf_component.yml` files to extract repository information\n\n### Dual Interface\n- Interactive TUI: Terminal interface with real-time monitoring and component management\n- CLI Mode: List components and boards, or build all boards\n- Live Logs: Real-time build output streaming\n- Build Status: Color-coded status indicators (⏳ Pending, ⚙️ Building, ✅ Success, ❌ Failed)\n\n### Script Generation\n- Build Scripts: Generates `build_{board}.sh` scripts\n- Flash Scripts: Creates `flash_{board}.sh` scripts for deployment\n- Automatic Cleanup: Handles target switching and dependency management\n- Cross-Platform: Works on macOS, Linux, and Windows\n\n### Logging\n- Individual Logs: Each board gets its own log file in `./logs/`\n- Build Artifacts: All outputs preserved for debugging\n- Progress Tracking: Real-time progress indicators\n- Error Reporting: Clear error messages and exit codes\n\n## 🚀 Quick Start\n\n### Installation\n\n#### One-Line Install (Recommended)\n```bash\n# Install espbrew directly from releases\ncurl -L https://georgik.github.io/espbrew/install.sh | bash\n```\n\n#### Homebrew (macOS Apple Silicon)\n```bash\n# Add tap first, then install (recommended)\nbrew tap georgik/espbrew\nbrew install espbrew\n```\n\n\u003e **Note**: The Homebrew formula is maintained in a separate repository: [georgik/homebrew-espbrew](https://github.com/georgik/homebrew-espbrew)\n\n#### Manual Installation\n```bash\n# Review the script first (optional)\ncurl -L https://georgik.github.io/espbrew/install.sh -o install.sh\nchmod +x install.sh\n./install.sh\n\n# Or build from source\ngit clone https://github.com/georgik/espbrew.git \u0026\u0026 cd espbrew\ncargo build --release\n\n# Or install directly from crates.io (when published)\ncargo install espbrew\n```\n\n#### Custom Installation Directory\n```bash\n# Install to custom directory (e.g., /usr/local/bin)\nexport INSTALL_DIR=/usr/local/bin\ncurl -L https://georgik.github.io/espbrew/install.sh | bash\n```\n\n#### Supported Platforms\n- **macOS** (Apple Silicon)\n- **Linux** (x86_64)\n- **Windows** (x86_64)\n\n### Basic Usage\n\n```bash\n# Interactive TUI mode (default) - uses current directory\n# TUI includes component management. Press 'b' to build, Tab to switch panes.\nespbrew\n\n# Interactive TUI mode with specific directory\nespbrew /path/to/your/esp-idf-project\n\n# CLI mode - list boards and components (default)\nespbrew --cli-only\nespbrew --cli-only list\n\n# CLI mode - build all boards\nespbrew --cli-only build\n\n# CLI mode with specific directory\nespbrew --cli-only /path/to/your/esp-idf-project\nespbrew --cli-only /path/to/your/esp-idf-project build\n\n# Help and options\nespbrew --help\n```\n\n### Example Project Structure\n\n```\nmy-esp-project/\n├── CMakeLists.txt\n├── main/\n├── components/\n├── sdkconfig.defaults.esp32_s3_box_3     # ESP32-S3-BOX-3 config\n├── sdkconfig.defaults.m5_atom_s3         # M5 Atom S3 config  \n├── sdkconfig.defaults.esp32_p4_function_ev # ESP32-P4 config\n├── sdkconfig.defaults.m5stack_tab5       # M5Stack Tab5 config\n└── sdkconfig.defaults                    # Base config\n```\n\nWhen you run ESPBrew on this project:\n\n```bash\nespbrew .\n```\n\nESPBrew will:\n1. 🔍 **Discover** 4 board configurations\n2. 📝 **Generate** 8 scripts (`build_*.sh` + `flash_*.sh`) in `./support/`\n3. 📁 **Create** `./logs/` for build logs\n4. 🏗️ **Build** all boards with separate build directories:\n   - `build.esp32_s3_box_3/`\n   - `build.m5_atom_s3/`\n   - `build.esp32_p4_function_ev/`\n   - `build.m5stack_tab5/`\n\n## 🎮 TUI Interface Guide\n\n### Navigation\n- **↑↓ or j/k**: Navigate within focused pane (boards, components, or logs)\n- **Tab**: Switch between Board List → Component List → Log Pane\n- **Enter**: Show action menu for selected item (board or component)\n- **b**: Build all boards\n- **r**: Refresh board and component lists\n- **h or ?**: Toggle help\n- **q**: Quit\n\n### Component Management\n- **Focus Component List**: Use Tab to navigate to the component pane\n- **Select Component**: Use ↑↓ to select a component\n- **Component Actions**: Press Enter to open the action menu with options:\n  - **Move to Components**: Move managed component to local components\n  - **Clone from Repository**: Clone component from Git repository to components\n    - **Wrapper Component Support**: Automatically handles wrapper components (e.g., `georgik__sdl`) by cloning with `--recursive --shallow-submodules` and extracting the correct subdirectory\n  - **Remove**: Delete component directory\n  - **Open in Editor**: Open component in system editor\n- **Board Actions**: Press Enter in Board List to access board actions:\n  - **Build**: Build the project for the selected board\n  - **Generate Binary**: Create single binary file for distribution\n  - **Flash**: Flash all partitions (bootloader, app, data)\n  - **Flash App Only**: Flash only the application partition (faster)\n  - **Monitor**: Flash and start serial monitor\n  - **Clean**: Clean build files\n  - **Purge**: Delete build directory\n- **Visual Indicators**:\n  - 📦 **Managed Component** (in `managed_components/`)\n  - 🔧 **Local Component** (in `components/`)\n\n### Interface Layout\n\n```\n┌─ 🍺 ESP Boards [FOCUSED] ─────┬─ Board Details ─────────────────┐\n│ ⏳ esp32_s3_box_3         │ Board: esp32_s3_box_3           │\n│ ⚙️  m5_atom_s3             │ Status: ⚙️  Building            │\n│ ✅ esp32_p4_function_ev    │ Config: sdkconfig.defaults.*    │\n├─ 🧩 Components ────────────┤ Build Dir: build.m5_atom_s3     │\n│ 📦 esp32_camera (managed)   ┼─ Build Log ─────────────────┤\n│ 🔧 my_component (local)     │ [CMake] Configuring done        │\n│ 📦 georgik__sdl (managed)   │ [CMake] Generating done          │\n└───────────────────────────┤ [Build] Building ESP-IDF app     │\n                            │ [Build] Compiling main.c         │\n                            └─────────────────────────────────┘\n```\n\n**Three-Pane Layout:**\n- **Left Panel (Top)**: ESP board list with build statuses\n- **Left Panel (Bottom)**: Component list with managed/local indicators\n- **Right Panel**: Board details and live build logs\n## 🛠️ CLI Mode\n\nPerfect for CI/CD pipelines, automated builds, and component inspection:\n\n```bash\n# List boards and components (default CLI behavior)\nespbrew --cli-only\nespbrew --cli-only list\n\n# Build all boards\nespbrew --cli-only build\n\n# Work with specific project directory\nespbrew --cli-only ./my-project\nespbrew --cli-only ./my-project build\n```\n\n### List Mode Example Output:\n```\n🍺 ESPBrew CLI Mode - Project Information\nFound 4 boards:\n  - esp32_s3_box_3 (sdkconfig.defaults.esp32_s3_box_3)\n  - m5_atom_s3 (sdkconfig.defaults.m5_atom_s3)\n  - esp32_p4_function_ev (sdkconfig.defaults.esp32_p4_function_ev)\n  - m5stack_tab5 (sdkconfig.defaults.m5stack_tab5)\n\nFound 8 components:\n  - OpenTyrian (./components/OpenTyrian) [local]\n  - esp32_camera (./managed_components/esp32_camera) [managed]\n  - georgik__sdl (./managed_components/georgik__sdl) [managed]\n  - my_custom_lib (./components/my_custom_lib) [local]\n\nUse 'espbrew --cli-only build' to start building all boards.\nUse 'espbrew' (without --cli-only) to launch the TUI for component management.\n```\n\n### Build Mode Example Output:\n```\n🍺 ESPBrew CLI Mode - Building all boards...\nFound 4 boards and 8 components...\n\n🔄 Starting builds for all boards...\n\n🔨 [esp32_s3_box_3] Executing action: set-target\n🔨 [m5_atom_s3] Configuring project...\n✅ [esp32_s3_box_3] Build completed successfully! (1/4 done)\n✅ [m5_atom_s3] Build completed successfully! (2/4 done)\n❌ [m5stack_tab5] Build failed! (3/4 done)\n✅ [esp32_p4_function_ev] Build completed successfully! (4/4 done)\n\n🍺 ESPBrew CLI Build Summary:\n  Total boards: 4\n  ✅ Succeeded: 3  \n  ❌ Failed: 1\n\nBuild logs saved in ./logs/\nFlash scripts available in ./support/\n⚠️  Some builds failed. Check the logs for details.\n```\n\n## 📁 Generated Files\n\n### Build Scripts (`./support/build_*.sh`)\n```bash\n#!/bin/bash\n# ESPBrew generated build script for esp32_s3_box_3\n\nset -e\n\necho \"🍺 ESPBrew: Building esp32_s3_box_3 board...\"\necho \"Project: /path/to/project\"\necho \"Config: sdkconfig.defaults.esp32_s3_box_3\"\necho \"Build dir: build.esp32_s3_box_3\"\n\ncd \"/path/to/project\"\n\n# Set target based on board configuration\nBOARD_CONFIG=\"sdkconfig.defaults.esp32_s3_box_3\"\nif grep -q \"esp32p4\" \"$BOARD_CONFIG\"; then\n    TARGET=\"esp32p4\"\nelif grep -q \"esp32c6\" \"$BOARD_CONFIG\"; then\n    TARGET=\"esp32c6\"\nelif grep -q \"esp32c3\" \"$BOARD_CONFIG\"; then\n    TARGET=\"esp32c3\"\nelse\n    TARGET=\"esp32s3\"\nfi\n\necho \"Target: $TARGET\"\n\n# Build with board-specific configuration\nSDKCONFIG_DEFAULTS=\"sdkconfig.defaults.esp32_s3_box_3\" idf.py -B \"build.esp32_s3_box_3\" set-target $TARGET\nSDKCONFIG_DEFAULTS=\"sdkconfig.defaults.esp32_s3_box_3\" idf.py -B \"build.esp32_s3_box_3\" build\n\necho \"✅ Build completed for esp32_s3_box_3\"\n```\n\n### Flash Scripts (`./support/flash_*.sh`)\n```bash\n#!/bin/bash\n# ESPBrew generated flash script for esp32_s3_box_3\n\nset -e\n\necho \"🔥 ESPBrew: Flashing esp32_s3_box_3 board...\"\necho \"Build dir: build.esp32_s3_box_3\"\n\ncd \"/path/to/project\"\n\nif [ ! -d \"build.esp32_s3_box_3\" ]; then\n    echo \"❌ Build directory does not exist. Please build first.\"\n    exit 1\nfi\n\n# Flash the board\nidf.py -B \"build.esp32_s3_box_3\" flash monitor\n\necho \"🔥 Flash completed for esp32_s3_box_3\"\n```\n\n## 🎯 Supported Board Patterns\n\nESPBrew automatically detects ESP32 targets from config files:\n\n| Pattern in Config | Detected Target | Example Board |\n|-------------------|----------------|---------------|\n| `esp32p4` or `CONFIG_IDF_TARGET=\"esp32p4\"` | `esp32p4` | M5Stack Tab5, ESP32-P4-Function-EV |\n| `esp32c6` or `CONFIG_IDF_TARGET=\"esp32c6\"` | `esp32c6` | ESP32-C6-DevKit |\n| `esp32c3` or `CONFIG_IDF_TARGET=\"esp32c3\"` | `esp32c3` | ESP32-C3-LCDKit |\n| Default | `esp32s3` | M5 Atom S3, ESP32-S3-BOX-3, M5Stack CoreS3 |\n\n## 🧩 Component Management\n\nESPBrew provides powerful component management capabilities for ESP-IDF projects:\n\n### Component Types\n\n- **🔧 Local Components** (in `components/` directory)\n  - User-created or modified components\n  - Full control over source code\n  - Version controlled with your project\n\n- **📦 Managed Components** (in `managed_components/` directory)\n  - Components managed by ESP Component Registry\n  - Installed via `idf.py add-dependency`\n  - Include manifest files (`idf_component.yml`)\n\n### Component Actions\n\n#### Move to Components\nMoves a managed component to the local components directory:\n- **Use Case**: When you need to modify a managed component\n- **Result**: Component becomes local and editable\n- **Location**: `managed_components/component` → `components/component`\n\n#### Clone from Repository  \nClones a component from its Git repository:\n- **Use Case**: Get the latest source code from the official repository\n- **Requirements**: Component must have `idf_component.yml` with repository URL\n- **Smart URL Handling**: Automatically converts `git://` to `https://` URLs\n- **Process**: \n  1. Reads `idf_component.yml` manifest file\n  2. Extracts repository URL (`repository`, `git`, or `url` fields)\n  3. Clones the repository to `components/component`\n  4. Removes the original managed component\n- **Result**: Fresh Git repository clone in components directory\n\n##### Wrapper Component Support\n\nESPBrew automatically detects and handles **wrapper components** that contain multiple sub-components. These are repositories that don't directly contain an ESP-IDF component, but instead contain subdirectories with the actual components.\n\n**Example**: The `georgik__sdl` component is a wrapper containing an `sdl/` subdirectory with the actual ESP-IDF component.\n\n**Automatic Wrapper Handling**:\n1. **Detection**: ESPBrew identifies wrapper components by name patterns (e.g., `georgik__sdl`)\n2. **Recursive Clone**: Uses `git clone --recursive --shallow-submodules` to include all submodules\n3. **Subdirectory Extraction**: Automatically finds and extracts the correct subdirectory\n4. **Placement**: Moves only the component subdirectory to `components/` with the proper name\n5. **Cleanup**: Removes the temporary wrapper repository clone\n\n**Supported Wrapper Components**:\n- `georgik__sdl` → extracts `sdl/` subdirectory\n- Additional wrapper components can be added as needed\n\n**Process Flow**:\n```\nWrapper Repository:\ngeorgik__sdl/\n├── sdl/              ← Target subdirectory\n│   ├── CMakeLists.txt\n│   ├── src/\n│   └── include/\n├── other_component/\n└── README.md\n\nResult in components/:\ncomponents/georgik__sdl/  ← Renamed from sdl/\n├── CMakeLists.txt\n├── src/\n└── include/\n```\n\n#### Remove Component\nDeletes a component directory entirely:\n- **Use Case**: Remove unused components\n- **Warning**: This permanently deletes the component\n\n#### Open in Editor\nOpens the component directory in your system's default editor:\n- **macOS**: Uses `open` command\n- **Linux**: Uses `xdg-open` command\n- **Windows**: Uses `explorer` command\n\n### Example Workflow\n\n1. **Discover Components**: Launch ESPBrew to see all components\n2. **Select Target**: Navigate to a managed component (e.g., `georgik__sdl`)\n3. **Choose Action**: Press Enter to see available actions\n4. **Clone Repository**: Select \"Clone from Repository\" to get latest source\n5. **Result**: Fresh Git repository in `components/georgik__sdl/`\n\n### Manifest File Support\n\nESPBrew reads `idf_component.yml` files to extract repository information:\n\n```yaml\nversion: \"2.0.11\"\nrepository: git://github.com/georgik/esp-idf-component-SDL.git\ndescription: \"ESP32 SDL wrapper component\"\nlicense: \"Zlib\"\n```\n\nSupported repository fields (in order of preference):\n1. `repository`: Primary repository URL field\n2. `git`: Alternative Git URL field  \n3. `url`: Fallback URL field\n\n## 🔧 Advanced Usage\n\n### Integration with IDEs\n\n**VS Code Task (`tasks.json`)**:\n```json\n{\n    \"version\": \"2.0.0\",\n    \"tasks\": [\n        {\n            \"label\": \"ESPBrew: Build All Boards\",\n            \"type\": \"shell\",\n            \"command\": \"espbrew\",\n            \"args\": [\"--cli-only\"],\n            \"group\": \"build\",\n            \"presentation\": {\n                \"echo\": true,\n                \"reveal\": \"always\"\n            }\n        }\n    ]\n}\n```\n\n### CI/CD Integration\n\n**GitHub Actions**:\n```yaml\nname: Multi-Board ESP32 Build\n\non: [push, pull_request]\n\njobs:\n  build:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v3\n      \n      - name: Setup ESP-IDF\n        uses: espressif/esp-idf-ci-action@v1\n        \n      - name: Install ESPBrew\n        run: cargo install espbrew\n        \n      - name: Build All Boards\n        run: espbrew --cli-only\n        \n      - name: Upload Build Artifacts\n        uses: actions/upload-artifact@v3\n        with:\n          name: build-artifacts\n          path: |\n            build.*/\n            logs/\n```\n\n### Binary Generation for Distribution\n\nESPBrew can generate single binary files for easy distribution and deployment:\n\n**Using the TUI**:\n1. Build your project first\n2. Select a board and press Enter\n3. Choose \"Generate Binary\" from the action menu\n4. ESPBrew creates `{board_name}-{target}.bin` in your project root\n\n**What it does**:\n- Uses `esptool.py merge_bin` to combine all flash components\n- Automatically detects target chip (esp32s3, esp32p4, esp32c6, etc.)\n- Creates a single binary file that can be flashed with:\n  ```bash\n  esptool.py --chip esp32s3 write_flash 0x0 my_board-esp32s3.bin\n  ```\n\n**Use Cases**:\n- **Distribution**: Send a single file instead of multiple components\n- **Production**: Simplified manufacturing and deployment process\n- **ESP Web Tools**: Compatible with browser-based flashing tools\n- **Custom Flashers**: Easy integration with custom flashing solutions\n\n**Generated Files**:\n```\nyour-project/\n├── esp32_s3_box_3-esp32s3.bin     # Complete binary for ESP32-S3-BOX-3\n├── m5stack_tab5-esp32p4.bin        # Complete binary for M5Stack Tab5\n└── esp32_p4_function_ev-esp32p4.bin # Complete binary for ESP32-P4-Function-EV\n```\n\n## 📊 Project Structure\n\nESPBrew creates the following structure:\n\n```\nyour-project/\n├── sdkconfig.defaults.*          # Your board configs\n├── components/                   # Local components (user-managed)\n│   ├── my_custom_lib/\n│   └── cloned_component/         # Components cloned from repositories\n├── managed_components/           # ESP Component Registry components\n│   ├── georgik__sdl/\n│   │   └── idf_component.yml     # Component manifest with repository info\n│   └── esp32_camera/\n├── build.{board_name}/           # Generated build dirs\n├── logs/                         # Generated by ESPBrew\n│   ├── esp32_s3_box_3.log\n│   ├── m5_atom_s3.log\n│   └── ...\n└── support/                      # Generated by ESPBrew\n    ├── build_esp32_s3_box_3.sh\n    ├── flash_esp32_s3_box_3.sh\n    ├── build_m5_atom_s3.sh\n    ├── flash_m5_atom_s3.sh\n    └── ...\n```\n\n## 🐛 Troubleshooting\n\n### Common Issues\n\n**Board Not Detected**:\n- Ensure your config file follows the pattern `sdkconfig.defaults.{board_name}`\n- Check that the config file contains `CONFIG_IDF_TARGET=\"...\"` or target-specific content\n\n**Build Failures**:\n- Check individual log files in `./logs/` directory\n- Verify ESP-IDF environment is properly set up\n- Ensure all dependencies are installed for the target platform\n\n**Permission Issues (macOS/Linux)**:\n- Generated scripts are automatically made executable\n- If needed: `chmod +x support/*.sh`\n\n**Component Not Showing Actions**:\n- \"Clone from Repository\" only appears for managed components with `idf_component.yml`\n- \"Move to Components\" only appears for managed components\n- Ensure component directories exist and are readable\n\n**Git Clone Failures**:\n- Check internet connectivity and repository accessibility\n- ESPBrew automatically converts `git://` URLs to `https://` for better compatibility\n- Verify the repository URL in `idf_component.yml` is correct\n\n**Component Action Failures**:\n- Ensure sufficient disk space for cloning repositories\n- Check write permissions for `components/` directory\n- Verify Git is installed and accessible in PATH\n\n### Debug Mode\n\nFor detailed debugging, check the log files:\n\n```bash\n# View build log for specific board\ntail -f logs/esp32_s3_box_3.log\n\n# View all recent activity\nls -la logs/\n```\n\n## 🤝 Contributing\n\nWe welcome contributions! Areas for improvement:\n\n- **More Board Support**: Add support for additional ESP32 variants\n- **Enhanced Component Management**: Additional component actions and integrations\n- **Enhanced TUI**: More interactive features and better error handling\n- **Performance**: Optimize build parallelization and component operations\n- **Integration**: More IDE, CI/CD, and component registry integrations\n\n## 📄 License\n\nMIT License - see LICENSE file for details.\n\n## 🙏 Credits\n\n- **Ratatui**: Terminal user interfaces for the interactive TUI\n- **Tokio**: Async runtime for concurrent builds and operations\n- **ESP-IDF**: Espressif IoT Development Framework\n- **Clap**: Command line argument parsing with subcommands\n- **serde_yaml**: YAML parsing for component manifests\n\n---\n\n🍺 ESPBrew - Simplifying ESP32 multi-board development\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgeorgik%2Fespbrew","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgeorgik%2Fespbrew","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgeorgik%2Fespbrew/lists"}