Welcome Contributors! 🎉
Thank you for considering contributing to Rusty Compress! We appreciate any help you can provide, whether it’s reporting bugs, fixing issues, adding features, or improving documentation.
Ways to Contribute
🐛 Report Bugs
Found a bug? Help us fix it!
- Search existing issues - Check if the bug has already been reported
- Create a detailed report - Include:
- Steps to reproduce
- Expected vs actual behavior
- Screenshots (if applicable)
- System information (OS, app version)
- Use appropriate labels - Bug, UI, Backend, etc.
💡 Suggest Features
Have an idea for improvement?
- Check roadmap - See if it’s already planned
- Create a feature request - Describe:
- The problem you’re solving
- Why this feature is useful
- Potential implementation approaches
- Discuss alternatives - Different ways to solve the problem
🔒 Security Issues
Found a security vulnerability?
- Don’t use public issues - Email security concerns privately
- Provide details - Describe the vulnerability and potential impact
- Allow time to fix - Give us time to develop and test a fix
📖 Improve Documentation
Documentation is crucial!
- Fix typos - Correct spelling and grammar mistakes
- Add examples - Provide code examples and use cases
- Clarify sections - Make complex topics easier to understand
- Translate - Help translate documentation to other languages
💻 Code Contributions
Ready to write code? Great!
Getting Started
1. Set Up Development Environment
# Fork the repository
# Clone your fork
git clone https://github.com/YOUR_USERNAME/rusty-compress.git
cd rusty-compress
# Install dependencies
npm install
# Set up development environment
npm run tauri dev
2. Choose What to Work On
- Good First Issues - Start with issues marked as “good first issue”
- Help Wanted - Issues needing community help
- Feature Requests - Implement requested features
3. Create a Branch
git checkout -b feature/your-feature-name
# or
git checkout -b fix/your-bug-fix
4. Make Your Changes
Follow our code style and patterns:
- Use existing component patterns
- Write clear, descriptive comments
- Add tests for new functionality
- Update documentation
5. Test Your Changes
# Run tests
npm test
cd src-tauri && cargo test
# Run linter
npm run lint
cd src-tauri && cargo clippy
# Build project
npm run build
npm run tauri build
6. Commit Your Changes
Follow Conventional Commits:
git add .
git commit -m "feat: add support for 7z archives"
# or
git commit -m "fix: resolve extraction progress issue"
7. Push and Create Pull Request
git push origin feature/your-feature-name
Then create a PR on GitHub with:
- Clear title and description
- Reference related issues
- Screenshots for UI changes
- Testing instructions
Coding Standards
General Guidelines
- Be consistent - Follow existing code patterns
- Keep it simple - Simple code is easier to maintain
- Test thoroughly - Write tests for new functionality
- Document clearly - Add helpful comments and documentation
Frontend (React)
// ✅ Good
const FileManager = ({ currentPath, onNavigate }) => {
const [files, setFiles] = useState([]);
useEffect(() => {
loadFiles(currentPath);
}, [currentPath]);
return <FileList files={files} onSelect={handleFileSelect} />;
};
// ❌ Bad
const FileManager = (props) => {
let [files, setFiles] = useState([]);
// Missing dependencies
useEffect(() => {
loadFiles(props.currentPath);
}, []);
return <div>{files.map(f => <div>{f.name}</div>)}</div>;
};
Backend (Rust)
// ✅ Good
#[tauri::command]
async fn read_directory(path: String) -> Result<Vec<FileInfo>, String> {
tokio::spawn_blocking(move || {
fs::read_dir(&path)
.map_err(|e| format!("Failed to read directory: {}", e))?
.filter_map(|entry| entry.ok())
.map(|entry| FileInfo::from(entry))
.collect()
}).await.map_err(|e| e.to_string())?
}
// ❌ Bad
#[tauri::command]
async fn read_directory(p: String) -> Result<Vec<FileInfo>> {
let entries = fs::read_dir(p).unwrap();
Ok(entries.collect())
}
Error Handling
// Frontend error handling
const handleSubmit = async () => {
try {
const result = await invoke('extract_files', params);
showSuccessNotification('Extraction complete!');
} catch (error) {
console.error('Extraction failed:', error);
showErrorNotification(error.message || 'Unknown error');
}
};
// Backend error handling
use thiserror::Error;
#[derive(Error, Debug)]
pub enum ArchiveError {
#[error("File not found: {0}")]
FileNotFound(String),
#[error("IO error: {0}")]
IoError(#[from] std::io::Error),
}
Testing
Frontend Tests
// Component test
describe('FileManager', () => {
test('displays file list', () => {
const files = [
{ name: 'file1.txt', size: 1024 },
{ name: 'file2.txt', size: 2048 }
];
render(<FileManager files={files} />);
expect(screen.getByText('file1.txt')).toBeInTheDocument();
expect(screen.getByText('file2.txt')).toBeInTheDocument();
});
});
Backend Tests
#[cfg(test)]
mod tests {
use super::*;
#[tokio::test]
async fn test_extract_files() {
let result = extract_files(
&app_handle(),
"test.zip",
"/tmp/output",
vec!["file.txt"]
).await;
assert!(result.is_ok());
}
}
Documentation
Code Documentation
/// Extracts files from an archive
///
/// # Arguments
/// * `archive_path` - Path to the archive file
/// * `output_path` - Destination directory for extracted files
/// * `selected_files` - List of files to extract (empty = all)
///
/// # Returns
/// Result indicating success or error
///
/// # Examples
/// ```rust
/// extract_files(&app, "archive.zip", "/tmp", vec!["file.txt"]).await
/// ```
#[tauri::command]
async fn extract_files(
app_handle: AppHandle,
archive_path: String,
output_path: String,
selected_files: Vec<String>
) -> Result<(), String> {
// Implementation
}
Pull Request Guidelines
Title Format
feat: add support for 7z archives
fix: resolve extraction progress issue
docs: update installation guide
refactor: simplify file manager component
test: add integration tests for checksum computation
Description Template
## Description
Brief description of changes
## Type of Change
- [ ] Bug fix
- [ ] New feature
- [ ] Breaking change
- [ ] Documentation update
## Related Issues
Fixes #123
Related to #456
## Testing
- [ ] Tests pass locally
- [ ] Added new tests
- [ ] Tested manually
## Screenshots (if applicable)
[Attach screenshots]
## Checklist
- [ ] Code follows style guidelines
- [ ] Tests added/updated
- [ ] Documentation updated
- [ ] Commit messages follow guidelines
Code Review Process
Before Submitting
- Self-review - Review your own changes
- Run tests - Ensure all tests pass
- Update docs - Keep documentation in sync
- Check formatting - Run linter and formatter
During Review
- Be responsive - Address feedback promptly
- Ask questions - Clarify review comments
- Iterate - Make requested changes
- Stay patient - Reviews take time
After Merging
- Update branches - Sync with upstream
- Celebrate - Your contribution is live!
- Keep contributing - There’s always more to do
Recognition
Contributors will be recognized in:
- CONTRIBUTORS.md - List of all contributors
- Release Notes - Credits for each release
- GitHub Stats - Contribution statistics
Community Guidelines
Be Respectful
- Treat others with respect and kindness
- Welcome newcomers and help them learn
- Assume good intentions
- Focus on what’s best for the community
Be Constructive
- Provide helpful, actionable feedback
- Explain reasoning clearly
- Suggest improvements
- Acknowledge good work
Be Inclusive
- Use inclusive language
- Consider diverse perspectives
- Make documentation accessible
- Support users of all skill levels
Communication Channels
- GitHub Issues - Bug reports and feature requests
- Pull Requests - Code contributions and reviews
- Discussions - Questions and ideas
- Email - For security concerns and private matters
Resources for Contributors
Learning Resources
Project Resources
Getting Help
Stuck? Ask for Help!
- Comment on issues - Ask for clarification
- Join discussions - Get community input
- Mention maintainers - Get expert help
- Search documentation - Find existing answers
No Question is Too Basic
We were all beginners once! Don’t hesitate to ask questions about:
- Setup and installation
- Code structure and patterns
- Testing and debugging
- Contribution process
Impact of Contributions
Your contributions help make Rusty Compress:
- More reliable - Bug fixes improve stability
- More capable - New features add functionality
- More accessible - Better docs help more users
- More popular - Quality improvements attract users
Thank You!
Every contribution, no matter how small, makes a difference. Thank you for helping make Rusty Compress better for everyone!
🎯 Ready to Make Your First Contribution?
Start by finding a "good first issue" or helping improve documentation. Every contribution counts!
Find Good First Issues Help Wanted