Thank you for your interest in contributing to MetaLens! We welcome bug reports, feature requests, documentation improvements, and code contributions from the community.
MetaLens is an open-source universal file metadata manager. Whether you're fixing a bug, improving documentation, adding a new metadata handler, or enhancing the UI, your contributions make MetaLens better for everyone.
Before contributing, please review this guide and our Code of Conduct.
- Main branch:
main(protected, release-only — taggedvX.Y.Zwith GitHub Release binaries) - Development branch:
develop(main integration branch, PRs target here) - Feature branches: Create from
develop, e.g.,feature/csv-export
- Fork the repository on GitHub
- Clone your fork locally
- Create a feature branch from
develop:git checkout develop git pull origin develop git checkout -b feature/your-feature-name
- Make your changes and test thoroughly
- Commit with clear messages (see Code Standards)
- Push to your fork
- Create a Pull Request targeting
develop(NOTmain)
Warning
main will be rejected. Always target develop.
- Python: 3.11, 3.12, or 3.13 (see REQUIREMENTS.md)
- Node.js: 20+
- npm: 10+
- Git
git clone https://github.com/YOUR-USERNAME/MetaLens.git
cd MetaLens
# Python sidecar
cd python
python -m venv .venv
source .venv/bin/activate # Linux
# .venv\Scripts\activate # Windows
pip install -r requirements.txt
# Electron + frontend
cd ../electron && npm install
cd ../frontend && npm install
# Run in development mode
cd ../electron && npm startThen enable the repo's git hooks (one-time per clone) so the Last updated footer in docs stays in sync automatically:
git config core.hooksPath .githooks- Follow the handler pattern in
python/core/handlers/— one file per category, implementingBaseMetadataHandler - Register new handlers in
python/core/registry.py - Add type hints on public functions
- Components live in
frontend/src/components/, shared logic infrontend/src/hooks/ - Follow the existing Tailwind v4 cyber color palette (
frontend/src/styles/globals.css) — never hardcode colors outside the defined CSS variables
Follow the conventional commits format:
type(scope): description
[optional body]
Types: feat, fix, docs, style, refactor, test, chore
Scope: handlers, api, ui, electron, deps, etc.
Examples:
feat(handlers): add support for HEIC imagesfix(diff): correct field alignment when types differdocs(readme): update supported formats table
All Python changes must pass the test suite:
pytest python/tests/ -v- New handlers or routes must include tests in
python/tests/ - All tests must pass: no regressions allowed
- After frontend changes, verify the production build still compiles:
cd frontend && npm run build
## Summary
Brief description of changes
## Related Issue
Fixes #(issue number) or Relates to #(issue number)
## Type of Change
- [ ] Bug fix (non-breaking)
- [ ] New feature
- [ ] Breaking change
- [ ] Documentation update
## Testing
- [ ] Added tests for new functionality
- [ ] `pytest python/tests/ -v` passes locally
- [ ] Tested on Windows/Linux (if applicable)
## Checklist
- [ ] Code follows style guidelines
- [ ] CLAUDE.md / CHANGELOG.md updated (if user-facing change)
- [ ] Version bumped in `python/config.py` (if applicable — see versioning rules below)- Keep PRs focused — one feature or bug fix per PR
- Reference related issues — use
Fixes #123to link issues - Be responsive — address feedback promptly
- Don't force-push — makes reviewing history difficult
MetaLens uses MAJOR.MINOR.PATCH, with python/config.py → VERSION as the single source of truth.
| Component | When it bumps |
|---|---|
| PATCH | Bug fix, dependency update, behavior correction |
| MINOR | New feature, new handler, new panel |
| MAJOR | Breaking change, milestone 1.0 |
If your change bumps the version, update all four locations: python/config.py, CHANGELOG.md, electron/package.json, frontend/package.json.
Dependabot proposes routine version bumps automatically, targeting develop. Security-alert PRs may target main due to a GitHub platform limitation — this is expected, not a misconfiguration.
To update manually:
# Python
pip list --outdated
pip install --upgrade package_name
pip freeze > python/requirements.txt
# Node (electron/ or frontend/)
npm outdated
npm update package_nameThen test thoroughly before committing:
pytest python/tests/ -v
cd frontend && npm run build- Documentation: Check docs/ folder
- Bugs: GitHub Issues
- Security: See SECURITY.md
Thank you for contributing to MetaLens! Your efforts help make file metadata management more accessible and transparent for everyone.
Last updated: 2026-07-14 ← Code of Conduct | Security →