Thank you for your interest in contributing to Arlo Meeting Assistant! This document provides guidelines and instructions for contributing to the project.
- Code of Conduct
- Getting Started
- Development Workflow
- Pull Request Process
- Coding Standards
- Testing Guidelines
- Documentation
By participating in this project, you agree to abide by our Code of Conduct. Please be respectful, inclusive, and constructive in all interactions.
- Be Respectful: Treat everyone with respect and consideration
- Be Inclusive: Welcome diverse perspectives and experiences
- Be Constructive: Focus on what is best for the community
- Be Professional: Maintain professionalism in all communications
- Node.js 20+
- Docker and Docker Compose
- PostgreSQL 15+ (or use Docker)
- ngrok (for local Zoom App testing)
- A Zoom account with developer access
-
Fork the repository on GitHub
-
Clone your fork:
git clone https://github.com/YOUR_USERNAME/arlo-meeting-assistant.git cd arlo-meeting-assistant -
Add upstream remote:
git remote add upstream https://github.com/ORIGINAL_OWNER/arlo-meeting-assistant.git
-
Set up environment variables:
cp .env.example .env # Edit .env with your Zoom credentials and generate secrets -
Start services:
docker-compose up --build
-
Run database migrations:
docker-compose exec backend npx prisma migrate dev -
Verify setup:
- Backend: http://localhost:3000/health
- Frontend: http://localhost:3001
- Database:
docker-compose exec backend npx prisma studio
main- Production-ready codedevelop- Integration branch for features (if used)feature/your-feature-name- New featuresfix/bug-description- Bug fixesdocs/what-changed- Documentation updates
# Update your local main branch
git checkout main
git pull upstream main
# Create a new feature branch
git checkout -b feature/my-new-feature-
Write clear, focused commits:
git add . git commit -m "feat: add real-time notification system - Implement WebSocket notification channel - Add notification UI component - Update API to broadcast events"
-
Commit message format:
feat:- New featurefix:- Bug fixdocs:- Documentation changesstyle:- Code style changes (formatting, semicolons, etc.)refactor:- Code refactoringtest:- Adding or updating testschore:- Build process or auxiliary tool changes
-
Keep commits atomic: Each commit should represent one logical change
-
Test your changes thoroughly before pushing
# Fetch latest changes from upstream
git fetch upstream
# Rebase your feature branch
git rebase upstream/main- Run the test suite (when available)
- Update documentation if needed
- Add comments to complex code sections
- Check for console errors and warnings
- Verify database migrations work correctly
- Test in both development and Docker environments
-
Push your branch:
git push origin feature/my-new-feature
-
Create a Pull Request on GitHub with:
- Clear title summarizing the change
- Detailed description of what and why
- Screenshots/GIFs for UI changes
- Link to related issues
-
PR Description Template:
## Summary Brief description of what this PR does ## Changes - Specific change 1 - Specific change 2 ## Testing - [ ] Tested locally with Docker - [ ] Tested in Zoom App - [ ] Database migrations verified - [ ] No console errors ## Screenshots (if applicable) ## Related Issues Closes #123
- Maintainers will review your PR within 3-5 business days
- Address feedback by pushing new commits to your branch
- Once approved, a maintainer will merge your PR
- After merge, you can delete your feature branch
- Use ES6+ features where appropriate
- Use
constby default,letwhen reassignment is needed - Use async/await over raw Promises
- Use template literals for string interpolation
- Destructure objects and arrays when it improves readability
// ✅ Good
const getUserMeetings = async (userId) => {
const meetings = await prisma.meeting.findMany({
where: { ownerId: userId },
orderBy: { startTime: 'desc' },
});
return meetings;
};
// ❌ Avoid
function getUserMeetings(userId) {
return prisma.meeting.findMany({where: {ownerId: userId}, orderBy: {startTime: 'desc'}}).then(meetings => {
return meetings
})
}// ✅ Always handle errors
try {
const result = await riskyOperation();
res.json({ result });
} catch (error) {
console.error('Operation failed:', error);
res.status(500).json({
error: 'Operation failed',
message: error.message
});
}- Use RESTful conventions
- Return appropriate HTTP status codes
- Include error messages in responses
- Use middleware for authentication
- Add comments for complex logic
- Use functional components with hooks
- Keep components focused and small
- Extract reusable logic into custom hooks
- Use prop-types or TypeScript for type checking
- Follow the existing component structure
When testing your changes:
-
Backend API:
- Health endpoint responds
- Authentication flow works
- API endpoints return correct data
- Error cases handled properly
-
Frontend:
- Zoom App loads correctly
- OAuth flow completes
- UI renders without errors
- WebSocket connection establishes
-
RTMS Integration:
- RTMS starts successfully
- Transcripts appear in real-time
- Segments save to database
- WebSocket broadcasts work
-
Database:
- Migrations apply cleanly
- Data persists correctly
- Relationships work as expected
We're working on adding automated tests. In the meantime:
- Manually test all affected functionality
- Check for console errors
- Verify database queries work correctly
Update documentation when you:
- Add a new API endpoint
- Change environment variables
- Modify database schema
- Add new features
- Change setup/deployment process
- README.md - Quick start and overview
- CLAUDE.md - Project instructions for Claude Code
- /docs/ - Detailed guides and references
- Code comments - Complex logic explanations
- API endpoints - JSDoc comments on routes
/**
* GET /api/meetings/:id/transcript
*
* Retrieve transcript segments for a specific meeting.
* Results are paginated and can be filtered by time range.
*
* @param {string} id - Meeting UUID
* @query {number} from_ms - Start time filter (milliseconds)
* @query {number} to_ms - End time filter (milliseconds)
* @query {number} limit - Max results (default: 100)
* @query {string} after_seq - Cursor for pagination
*
* @returns {Object} segments - Array of transcript segments
* @returns {string} cursor - Pagination cursor
*/
router.get('/:id/transcript', async (req, res) => {
// Implementation
});- Issues: Open a GitHub issue for bugs or feature requests
- Discussions: Use GitHub Discussions for questions
- Security: Email security@yourproject.com for security issues
Contributors will be recognized in:
- GitHub contributors list
- Release notes (for significant contributions)
- Project README (for major features)
Thank you for contributing to Arlo Meeting Assistant! 🎉