First off, thank you for considering contributing to Croom! 🎉
It's people like you that make Croom such a great tool for transforming conference rooms around the world. We welcome contributions from everyone, whether it's:
- 🐛 Reporting a bug
- 💡 Suggesting a feature
- 📝 Improving documentation
- 💻 Writing code
- 🧪 Testing and providing feedback
- 🌍 Translating to other languages
- Code of Conduct
- Getting Started
- Development Environment
- How to Contribute
- Pull Request Process
- Coding Standards
- Testing Guidelines
- Documentation
- Community
By participating in this project, you agree to abide by our Code of Conduct:
- Be respectful - Treat everyone with respect. No harassment, discrimination, or offensive behavior.
- Be constructive - Provide helpful feedback. Avoid personal attacks.
- Be collaborative - Work together toward common goals. Share knowledge freely.
- Be patient - Remember that everyone was new once. Help newcomers learn.
Before you begin, ensure you have:
- Python 3.10+ installed
- Node.js 18+ (for dashboard development)
- Git for version control
- A GitHub account
For device testing:
- Raspberry Pi 4 or 5 (recommended)
- USB webcam
- Microphone/speaker
- Fork the repository on GitHub
- Clone your fork locally:
git clone https://github.com/YOUR-USERNAME/croom.git
cd croom- Add upstream remote:
git remote add upstream https://github.com/amirhmoradi/croom.git- Keep your fork synced:
git fetch upstream
git checkout main
git merge upstream/main# Create virtual environment
python3 -m venv venv
source venv/bin/activate # On Windows: venv\Scripts\activate
# Install in development mode
pip install -e ".[dev]"
# Verify installation
croom --versioncd src/croom-dashboard/backend
# Install dependencies
npm install
# Start development server
npm run devcd src/croom-dashboard/frontend
# Install dependencies
npm install
# Start development server
npm run dev# Install Qt dependencies (Debian/Ubuntu)
sudo apt install python3-pyside6.qtcore python3-pyside6.qtgui \
python3-pyside6.qtwidgets python3-pyside6.qtqml python3-pyside6.qtquick
# Run Touch UI
python -m croom_ui.main --windowed --debug# Start everything (requires tmux or multiple terminals)
make dev
# Or individually:
make dev-agent # Start Croom agent
make dev-dashboard # Start dashboard backend + frontend
make dev-ui # Start Touch UIFound a bug? Please help us fix it!
- Search existing issues to avoid duplicates
- Open a new issue using the bug report template
- Include details:
- Steps to reproduce
- Expected vs actual behavior
- Screenshots/logs if applicable
- Environment info (OS, Python version, hardware)
### Bug Description
[Clear description of the bug]
### Steps to Reproduce
1. Go to '...'
2. Click on '...'
3. See error
### Expected Behavior
[What should happen]
### Actual Behavior
[What actually happens]
### Environment
- OS: Raspberry Pi OS Bookworm
- Python: 3.11
- Hardware: Pi 5, Hailo-8LHave an idea? We'd love to hear it!
- Check the roadmap first: docs/roadmap/enterprise-roadmap.md
- Search existing issues for similar suggestions
- Open a feature request with:
- Problem you're trying to solve
- Proposed solution
- Alternative approaches considered
- Potential impact on existing features
Ready to write some code? Here's how:
-
Find an issue to work on
- Look for
good first issuelabels for beginners - Look for
help wantedlabels for more challenging tasks - Comment on the issue to claim it
- Look for
-
Create a branch:
git checkout -b feature/your-feature-name
# or
git checkout -b fix/bug-description-
Make your changes following our coding standards
-
Write tests for new functionality
-
Run tests locally:
pytest- Commit your changes:
git add .
git commit -m "feat: add awesome new feature"Use Conventional Commits:
feat:- New featurefix:- Bug fixdocs:- Documentation changesstyle:- Code style changes (formatting)refactor:- Code refactoringtest:- Adding testschore:- Maintenance tasks
- Push and create PR:
git push origin feature/your-feature-nameThen open a Pull Request on GitHub.
- Code follows our style guidelines
- Self-review completed
- Tests added/updated
- Documentation updated
- All tests pass locally
- Branch is up to date with main
## Description
[Brief description of changes]
## Type of Change
- [ ] Bug fix
- [ ] New feature
- [ ] Documentation update
- [ ] Refactoring
- [ ] Other (specify)
## Related Issues
Closes #123
## Testing
- [ ] Unit tests pass
- [ ] Integration tests pass
- [ ] Tested on real hardware
## Screenshots (if applicable)
[Add screenshots]
## Checklist
- [ ] Code follows style guidelines
- [ ] Documentation updated
- [ ] Tests added- Automated checks run on your PR
- Maintainers review your code
- Address feedback if requested
- PR gets merged once approved! 🎉
# Use type hints
def process_frame(frame: np.ndarray, threshold: float = 0.5) -> List[Detection]:
"""Process a video frame for detections.
Args:
frame: Input frame as numpy array (HWC, BGR)
threshold: Minimum confidence threshold
Returns:
List of detected objects
"""
pass
# Use dataclasses for data structures
@dataclass
class Detection:
class_id: int
confidence: float
bbox: Tuple[float, float, float, float]
# Async functions for I/O operations
async def fetch_calendar_events(calendar_id: str) -> List[Event]:
pass// Use interfaces for types
interface Device {
id: string;
name: string;
status: 'online' | 'offline' | 'error';
lastSeen: Date;
}
// Use async/await
async function fetchDevices(): Promise<Device[]> {
const response = await api.get('/devices');
return response.data.devices;
}
// React components with TypeScript
interface DeviceCardProps {
device: Device;
onSelect?: (device: Device) => void;
}
export function DeviceCard({ device, onSelect }: DeviceCardProps) {
return (
<div onClick={() => onSelect?.(device)}>
{device.name}
</div>
);
}# Python - use black and ruff
black src/
ruff check src/ --fix
# TypeScript - use prettier and eslint
npm run lint
npm run format# tests/unit/test_detector.py
import pytest
from croom.platform.detector import PlatformDetector
def test_detect_raspberry_pi(mock_pi_environment):
"""Test detection on Raspberry Pi hardware."""
info = PlatformDetector.detect()
assert info.device.value.startswith('rpi')
@pytest.mark.asyncio
async def test_ai_inference():
"""Test AI inference returns valid results."""
backend = MockAIBackend()
result = await backend.infer(mock_frame)
assert len(result.detections) >= 0# All tests
pytest
# With coverage
pytest --cov=croom
# Specific module
pytest tests/unit/test_meeting.py
# Verbose output
pytest -v# Requires connected hardware
pytest tests/integration/ --hardware
# Dashboard tests
cd src/croom-dashboard/backend
npm testGood documentation is crucial. Please update docs when:
- Adding new features
- Changing existing behavior
- Adding new configuration options
- Creating new APIs
docs/
├── guides/ # User-facing guides
├── prd/ # Product requirements
├── roadmap/ # Development roadmap
├── api/ # API documentation
└── README.md # Documentation index
- Use clear, concise language
- Include code examples
- Add screenshots for UI features
- Keep docs up to date with code
croom/
├── src/
│ ├── croom/ # Core Python package
│ │ ├── core/ # Agent, config, services
│ │ ├── platform/ # Platform detection
│ │ ├── ai/ # AI backends
│ │ ├── meeting/ # Meeting providers
│ │ ├── audio/ # Audio handling
│ │ └── video/ # Video handling
│ ├── croom-ui/ # Touch UI (Qt6/QML)
│ └── croom-dashboard/ # Management dashboard
│ ├── backend/ # Node.js API
│ └── frontend/ # React app
├── tests/ # Test suite
├── docs/ # Documentation
├── installer/ # Installation scripts
└── packaging/ # Distribution packaging
- 💬 GitHub Discussions - Ask questions, share ideas
- 📧 Mailing List - croom-help@googlegroups.com
- 🐛 Issue Tracker - Report bugs, request features
Contributors are recognized in:
- README.md contributors section
- Release notes
- Annual contributor spotlight
Current maintainers:
- @amirhmoradi - Project Lead
Want to become a maintainer? Consistent, quality contributions over time may lead to maintainer status.
Every contribution matters, no matter how small. Thank you for helping make Croom better for everyone!
Happy Contributing! 🎥🍰