{"id":50955912,"url":"https://github.com/dynamotn/blackduck-tui","last_synced_at":"2026-06-18T06:32:57.330Z","repository":{"id":350628807,"uuid":"1207650841","full_name":"dynamotn/blackduck-tui","owner":"dynamotn","description":"TUI for Blackduck SCA","archived":false,"fork":false,"pushed_at":"2026-05-02T04:03:40.000Z","size":142,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-05-02T06:15:00.074Z","etag":null,"topics":["bill-of-material","blackduck","cli","rust","security-tools","software-composition-analysis","tui"],"latest_commit_sha":null,"homepage":"","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/dynamotn.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":"2026-04-11T07:59:14.000Z","updated_at":"2026-05-02T04:03:37.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/dynamotn/blackduck-tui","commit_stats":null,"previous_names":["dynamotn/blackduck-tui"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/dynamotn/blackduck-tui","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dynamotn%2Fblackduck-tui","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dynamotn%2Fblackduck-tui/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dynamotn%2Fblackduck-tui/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dynamotn%2Fblackduck-tui/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dynamotn","download_url":"https://codeload.github.com/dynamotn/blackduck-tui/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dynamotn%2Fblackduck-tui/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34479553,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-18T02:00:06.871Z","response_time":128,"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":["bill-of-material","blackduck","cli","rust","security-tools","software-composition-analysis","tui"],"created_at":"2026-06-18T06:32:56.666Z","updated_at":"2026-06-18T06:32:57.321Z","avatar_url":"https://github.com/dynamotn.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Black Duck TUI\n\nA Terminal User Interface (TUI) for browsing Black Duck Software Composition Analysis (SCA) data.\n\n![License](https://img.shields.io/badge/license-MIT-blue.svg)\n![Rust](https://img.shields.io/badge/rust-1.70%2B-orange.svg)\n\n## Features\n\n- 🔍 **Browse Projects \u0026 Versions**: Navigate through your Black Duck projects and their versions\n- 📦 **Component Management**: View BOM (Bill of Materials) components with detailed information\n- 🛡️ **Security Insights**: Browse vulnerabilities with CVE details and severity scores\n- ⚠️ **Policy Violations**: Track policy rule violations across components\n- 🔎 **Advanced Filtering**: Filter components by:\n  - Policy Status (IN_VIOLATION, NOT_IN_VIOLATION, etc.)\n  - Review Status (UNREVIEWED, REVIEWED, etc.)\n  - Approval Status (APPROVED, REJECTED, PENDING)\n  - Policy Rule Name (server-side filtering)\n- 🔍 **Search**: Quick search across component names\n- ⌨️ **Keyboard Navigation**: Vim-style keybindings for efficient navigation\n- 📊 **Pagination**: Handle large datasets with automatic pagination\n\n## Installation\n\n### Prerequisites\n\n- Rust 1.70 or higher\n- Access to a Black Duck server\n- Black Duck API token\n\n### Build from Source\n\n```bash\ngit clone https://github.com/dynamotn/blackduck-tui.git\ncd blackduck-tui || exit\ncargo build --release\n```\n\nThe binary will be available at `target/release/blackduck-tui`.\n\n## Configuration\n\nBlack Duck TUI looks for configuration in the following locations (in order):\n\n1. `~/.config/blackduck-tui/config.toml` (Linux/macOS)\n2. `%APPDATA%\\blackduck-tui\\config.toml` (Windows)\n3. Environment variables\n\n### Configuration File\n\nCreate a `config.toml` file:\n\n```toml\n[server]\nurl = \"https://your-blackduck-server.com\"\ntoken = \"your-api-token-here\"\naccept_invalid_certs = false\n\n[tui]\npage_size = 100\n```\n\n### Environment Variables\n\nYou can also use environment variables (they override config file values):\n\n```bash\nexport BLACKDUCK_URL=\"https://your-blackduck-server.com\"\nexport BLACKDUCK_TOKEN=\"your-api-token-here\"\nexport BLACKDUCK_ACCEPT_INVALID_CERTS=\"false\"\n```\n\n## Usage\n\n### Running the Application\n\n```bash\n# Using the binary\n./target/release/blackduck-tui\n\n# Or with cargo\ncargo run --release\n\n# With debug logging\nRUST_LOG=debug cargo run --release\n```\n\n### Keyboard Shortcuts\n\n#### General Navigation\n- `↑`/`k` - Move up\n- `↓`/`j` - Move down\n- `←`/`h` - Move left panel / Go back\n- `→`/`l` - Move right panel / Go forward\n- `Tab` - Switch focus between left and right panels\n- `Esc` - Go back to previous screen / Close popup\n- `q` - Quit application\n\n#### Tabs (when viewing a version)\n- `1` - Components tab\n- `2` - Vulnerabilities tab\n- `3` - Policy Violations tab\n\n#### Filtering \u0026 Search\n- `f` - Open filter popup\n- `/` - Open search input\n- `Space` - Toggle filter option (in filter popup)\n- `Enter` - Apply filter / Confirm selection\n\n#### Pagination\n- `n` - Next page\n- `p` - Previous page\n\n### Navigation Flow\n\n1. **Login Screen**: Enter your credentials (if not configured)\n2. **Projects List**: Browse and select a project\n3. **Versions List**: Select a project version\n4. **Version Details**: View components, vulnerabilities, and policy violations\n   - Switch between tabs using `1`, `2`, `3`\n   - Filter components using `f`\n   - Search components using `/`\n   - Navigate pages using `n`/`p`\n\n## Logging\n\nLogs are written to:\n- Linux/macOS: `~/.local/share/blackduck-tui/blackduck-tui.log`\n- Windows: `%LOCALAPPDATA%\\blackduck-tui\\blackduck-tui.log`\n\nEnable debug logging:\n```bash\nRUST_LOG=debug ./blackduck-tui\n```\n\n## Architecture\n\nThe application is structured as follows:\n\n```\nsrc/\n├── main.rs           # Entry point, TUI setup\n├── app.rs            # Application state management\n├── events.rs         # Event handling and async operations\n├── ui/               # UI rendering\n│   └── mod.rs\n├── api/              # Black Duck API client\n│   ├── client.rs     # HTTP client implementation\n│   ├── types.rs      # API response types\n│   └── error.rs      # Error types\n└── config.rs         # Configuration management\n```\n\n### Key Technologies\n\n- **[ratatui](https://github.com/ratatui-org/ratatui)**: Terminal UI framework\n- **[crossterm](https://github.com/crossterm-rs/crossterm)**: Cross-platform terminal manipulation\n- **[tokio](https://tokio.rs/)**: Async runtime\n- **[reqwest](https://github.com/seanmonstar/reqwest)**: HTTP client\n- **[serde](https://serde.rs/)**: Serialization/deserialization\n\n## Development\n\n### Running Tests\n\n```bash\ncargo test\n```\n\n### Running Clippy\n\n```bash\ncargo clippy --all-targets --locked -- -D warnings\n```\n\n### Code Formatting\n\n```bash\ncargo fmt\n```\n\n## API Integration\n\nThe application uses the Black Duck REST API with the following key endpoints:\n\n- `/api/tokens/authenticate` - Authentication\n- `/api/projects` - List projects\n- `/api/projects/{id}/versions` - List versions\n- `/api/versions/{id}/components` - List BOM components\n- `/api/versions/{id}/vulnerable-bom-components` - List vulnerabilities\n- `/api/versions/{id}/policy-status` - List policy violations\n- `/api/versions/{id}/components-filters` - Get available filter options\n\nAll filtering is performed server-side for optimal performance.\n\n## Troubleshooting\n\n### Authentication Issues\n\nIf you see \"Failed to authenticate\":\n1. Verify your Black Duck server URL is correct\n2. Check that your API token is valid\n3. Ensure network connectivity to the Black Duck server\n\n### Certificate Issues\n\nIf you're using a self-signed certificate:\n```toml\n[server]\naccept_invalid_certs = true\n```\n\nOr set environment variable:\n```bash\nexport BLACKDUCK_ACCEPT_INVALID_CERTS=\"true\"\n```\n\n## Contributing\n\nContributions are welcome! Please feel free to submit a Pull Request.\n\n### Development Guidelines\n\n1. Follow Rust best practices and idioms\n2. Maintain test coverage\n3. Ensure clippy passes with no warnings\n4. Update documentation as needed\n\n## License\n\nThis project is licensed under the MIT License - see the LICENSE file for details.\n\n## Acknowledgments\n\n- Built with [ratatui](https://github.com/ratatui-org/ratatui)\n- Inspired by terminal UI tools like lazygit and k9s\n\n## Roadmap\n\n- [ ] Export components/vulnerabilities to CSV/JSON\n- [ ] Component details view\n- [ ] Vulnerability remediation guidance\n- [ ] Custom filter presets\n- [ ] Multi-version comparison\n- [ ] Dark/light theme support\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdynamotn%2Fblackduck-tui","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdynamotn%2Fblackduck-tui","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdynamotn%2Fblackduck-tui/lists"}