-
-
Notifications
You must be signed in to change notification settings - Fork 55
Contributing
Thank you for your interest in contributing to Rhythm Music Player! This guide will help you get started.
Found a bug? Help us fix it!
Before Reporting:
- Check existing issues to avoid duplicates
- Try the latest version to see if it's already fixed
- Gather information about your device and app version
How to Report:
- Go to GitHub Issues
- Choose "Bug Report" template
- Fill in all required information:
- Android version (e.g., Android 14)
- Device model (e.g., Pixel 7)
- Rhythm version (e.g., v5.1.414.1085 Beta)
- Steps to reproduce
- Expected vs actual behavior
- Screenshots/logs if applicable
Have an idea? We'd love to hear it!
Before Suggesting:
- Check existing feature requests
- Search Discussions for similar ideas
- Consider if it aligns with Rhythm's philosophy (privacy, FOSS, simplicity)
How to Suggest:
- Open a new issue with "Feature Request" label
- Describe:
- What feature you want
- Why it's useful
- How it should work
- Potential implementation ideas (optional)
Documentation is crucial for user experience!
Documentation Needs:
- Fix typos and grammar errors
- Clarify confusing sections
- Add missing information
- Update outdated content
- Translate to other languages
How to Contribute:
- Fork the repository
- Edit
.mdfiles in/wiki/or/docs/ - Submit a pull request
- Include clear description of changes
Ready to code? Here's how to start!
What We Need:
- Bug fixes
- Performance improvements
- UI/UX enhancements
- New feature implementations
- Code refactoring
- Test coverage
Before Coding:
- Check open issues for tasks
- Comment on issue to claim it
- Discuss implementation approach if needed
- Fork the repository
- Android Studio: Latest stable version (Ladybug or newer)
- JDK: 21 or higher (required for Gradle 9.x)
- Kotlin: 2.4.x (bundled with Android Studio)
- Git: For version control
- Android Device/Emulator: API 26+ for testing
git clone https://github.com/cromaguy/Rhythm.git
cd Rhythm- Open Android Studio
- Select File β Open and choose Rhythm folder
- Wait for Gradle sync to complete
- Click Build β Make Project (or Ctrl+F9)
- Connect Android device with USB debugging enabled
- Or start Android emulator (API 26+)
- Click Run β Run 'app' (or Shift+F10)
Follow official Kotlin conventions:
// Good
class MusicPlayer {
fun playTrack(song: Song) {
// Implementation
}
}
// Bad
class musicPlayer {
fun PlayTrack(Song: Song) {
// Implementation
}
}- Use
@Composablefunctions for UI - Prefer
rememberandrememberSaveablefor state - Extract reusable components
- Follow Material 3 guidelines
@Composable
fun SongItem(
song: Song,
onClick: () -> Unit,
modifier: Modifier = Modifier
) {
Card(
onClick = onClick,
modifier = modifier
) {
// UI implementation
}
}- MVVM Pattern: ViewModels for business logic
- Repository Pattern: Data access abstraction
- Dependency Injection: Manual DI
- Clean Architecture: Separation of concerns
app/src/main/java/chromahub/rhythm/app/
βββ core/
β βββ domain/ # Domain interfaces and models
βββ features/
β βββ local/ # Local playback features
β β βββ data/ # Data layer
β β βββ domain/ # Business logic
β β βββ presentation/ # UI components
β βββ streaming/ # Streaming playback features
β βββ data/ # Network and data layer
β βββ domain/ # Business logic
β βββ di/ # Streaming DI modules
β βββ infrastructure/ # Streaming services
β βββ presentation/ # UI components
βββ shared/ # Shared utilities, themes, navigation
βββ infrastructure/ # Player, widgets, workers, network
βββ network/ # Network client configuration
- Write self-documenting code
- Add comments for complex logic
- Use KDoc for public APIs
/**
* Plays the specified song and updates playback state.
*
* @param song The song to play
* @param startPosition Position to start playback (milliseconds)
*/
fun playSong(song: Song, startPosition: Long = 0L) {
// Implementation
}- Unit tests for ViewModels and utilities
- UI tests for critical user flows
- Integration tests for data layer
@Test
fun `test playback state updates correctly`() {
val player = ExoPlayer.Builder(context).build()
player.prepare()
player.play()
assertThat(player.playbackState).isEqualTo(Player.STATE_READY)
}# Unit tests
./gradlew test
# Instrumented tests
./gradlew connectedAndroidTestgit checkout -b feature/your-feature-name
# or
git checkout -b fix/bug-description- Write clean, documented code
- Follow existing code style
- Keep commits focused and atomic
- Write descriptive commit messages
git add .
git commit -m "feat: add lyrics sync adjustment controls"
# or
git commit -m "fix: resolve crash on empty playlist"git push origin feature/your-feature-name- Go to Rhythm repository
- Click Pull Requests β New Pull Request
- Select your fork and branch
- Fill in PR template:
- Title: Clear, descriptive summary
- Description: What, why, and how
-
Related Issues: Link with
Fixes #123 - Screenshots: For UI changes
- Testing: How you tested changes
- Respond to feedback promptly
- Make requested changes
- Push updates to same branch
- Be patient and respectful
Once approved:
- Maintainer will merge your PR
- Your contribution will be in next release!
- You'll be credited in changelog
- Material 3: Follow Material Design guidelines
- Consistency: Match existing UI patterns
- Accessibility: Support screen readers, high contrast
- Performance: Smooth animations, no jank
- Simplicity: Intuitive, not cluttered
- Use theme colors, not hardcoded values
- Implement both light and dark modes
- Test on different screen sizes
- Support landscape orientation
- Add haptic feedback for interactions
- Fork repository
- Create new language resource folder:
app/src/main/res/values-{language_code}/ - Copy
strings.xmlfromvalues/ - Translate all strings
- Submit pull request
- Check existing translation for missing/outdated strings
- Update
values-{language_code}/strings.xml - Submit pull request
Translation Guidelines:
- Maintain original meaning
- Use formal/informal tone appropriately
- Keep placeholders intact (
%s,%d, etc.) - Test UI to ensure text fits
Follow Conventional Commits:
<type>(<scope>): <description>
[optional body]
[optional footer]
Types:
-
feat: New feature -
fix: Bug fix -
docs: Documentation changes -
style: Code formatting (no logic change) -
refactor: Code restructuring -
perf: Performance improvement -
test: Adding/updating tests -
chore: Maintenance tasks
Examples:
feat(player): add playback speed control
fix(lyrics): resolve sync offset not saving
docs(readme): update installation instructions
refactor(viewmodel): simplify state management
Before submitting PR, verify:
- Code builds without errors
- No new compiler warnings
- Follows Kotlin code style
- UI matches Material 3 guidelines
- Works on API 26+ (compileSdk 37)
- Tested on physical device
- No hardcoded strings (use resources)
- Added/updated documentation
- Wrote/updated tests (if applicable)
- No merge conflicts
Get Help:
- Telegram Community - Live chat
- Discord Server - Community chat
- GitHub Discussions - Q&A
- GitHub Issues - Specific issues
Be Respectful:
- Follow Code of Conduct
- Be patient with responses
- Help others when you can
- Respect maintainers' decisions
Contributors are recognized in:
- README.md Credits section
- CHANGELOG.md for each release
- GitHub Contributors page
- App's "About" section (major contributors)
By contributing, you agree that your contributions will be licensed under the GPL-3.0 License.
Thank you for contributing to Rhythm! π΅
Your contributions help make Rhythm better for everyone. Whether it's code, documentation, translations, or bug reports, every contribution matters!
Quick Links: