Picard and associated plugins and documentation has been a collaborative effort by volunteer contributors from the very start, and contributions continue to be welcome from anyone in the community, as:
- Code improvements in Picard itself (as PRs to this repo)
- Language translations for Picard (see the Translations README)
- New or modified plugins (as PRs on the Picard-Plugins repo)
- Documentation improvements on the Picard-Docs website
- Answering user questions in the Picard section of the Community discussion board
Note: Picard and Picard-Plugins code are currently in a state of flux due to development of Picard v3. If you want to contribute by coding, then please discuss this with Phillip Wolfer or Zas before starting.
Please be aware that we try to maintain high quality standards in all these areas, that there is a learning curve to being able to make high-quality contributions, and we consider achieving this to be a team effort with other community members chipping in to help you achieve the quality needed. So please be prepared to welcome constructive criticism on your proposed contributions and consider the effort that is being expended by others to help you in the positive light it is given.
If you want to contribute to the Picard code, then please read-on for details on:
- To-do list
- Technical Setup
- Development Workflow
- Coding Standards
- Git Workflow
- Documentation
- Audio Metadata Standards
Before starting you might want to ask more experienced contributors for advice about how to get started, and the easiest way for this would be to ask in the MusicBrainz Picard Development chat room on Matrix.
In many cases, people make contributions because of their own experiences - they have had an issue or can see a way that Picard could be improved.
However if you simply would like to contribute and are looking for ideas, then a to-do list of outstanding issues are areas for improvement can be found on the MusicBrainz Jira Tickets system - Picard project.
If you want to pick one of these to work on, make sure that you start with something small as many of these are large-scale, long-term suggestions - if in doubt ask for advice in the chat room so that you don't spend time and effort on something that is too complex or which won't get merged.
gettext (required for translations):
- Windows: Download from gettext-iconv-windows and add
C:\Program Files\gettext-iconv\binto PATH - Linux:
sudo apt install gettext - macOS:
brew install gettext(if not included with Xcode Command Line Tools)
uv is an extremely fast Python package manager:
# macOS/Linux
curl -LsSf https://astral.sh/uv/install.sh | sh
# Windows
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"# Clone and enter the repository
git clone https://github.com/metabrainz/picard.git
cd picard
# Create virtual environment
uv venv
source .venv/bin/activate # macOS/Linux
# .venv\Scripts\activate.bat # Windows
# Install all dependencies (main, build, dev)
uv sync
# Build the project
python setup.py build # Compiles translations and prepares build files
python setup.py build_ext -i # Builds C extensions in-place for development
# Install in editable mode
uv pip install -e .# After installing in editable mode (recommended)
picard
# Or run directly from source (without installation)
python ./tagger.py
# With debug mode
picard -d
# or
python ./tagger.py -d# With activated virtual environment
pytest -n auto
# Or using uv (if not in activated venv)
uv run pytest -n autoDependencies are defined in pyproject.toml using modern Python packaging standards:
- Main dependencies: Runtime requirements for Picard
- build: Build tools (Babel, PyInstaller, pytest, setuptools)
- dev: Development tools (ruff, pre-commit, pylint, etc.)
- plugins: Optional plugin dependencies (aubio, opencc, zstandard)
Important: Never edit requirements files manually. They are auto-generated from pyproject.toml.
Install pre-commit hooks for automatic code quality checks:
pre-commit installThis runs ruff for code style and updates requirements files automatically before each commit.
To manually update requirements after changing pyproject.toml:
pre-commit run pip-compile --all-filesIf you prefer not to use uv:
# Create virtual environment
python3 -m venv .venv
source .venv/bin/activate
# Install dependencies
pip install -r requirements.txt
pip install -r requirements-build.txt
pip install -r requirements-dev.txt
# Build and install
python setup.py build # Compiles translations and prepares build files
python setup.py build_ext -i # Builds C extensions in-place for development
pip install -e .With uv (recommended):
# uv automatically manages Python versions
uv venv --python 3.11
uv venv --python 3.12
source .venv/bin/activate
uv syncWith system Python:
# Create separate virtual environments
python3.11 -m venv .venv311
python3.12 -m venv .venv312
# Activate desired version
source .venv311/bin/activate # or .venv312/bin/activate
# Install dependencies manually
pip install -r requirements.txt -r requirements-build.txt -r requirements-dev.txtWe follow PEP 8 with these exceptions:
- E501: Line length limit is ~120-130 characters (not 79)
The goal is consistent, readable code within the project.
Code formatting and linting:
# Format code automatically
ruff format
# Check for style and lint issues
ruff check
# Auto-fix issues where possible
ruff check --fixUse "Google-style" docstrings for functions that aren't immediately obvious.
- UI Files: Don't edit
picard/ui/ui_*.pydirectly - these are auto-generated. Use Qt Designer to editui/*.uifiles, then runpython setup.py build_uito regenerate the Python files - Naming: Use snake_case for functions/variables (except pre-generated PyQt code)
- Internationalization: Use
_()for translatable strings andN_()for gettext-noop
- Fork the repository to your account
- Create a branch with a meaningful name (e.g.,
picard-257orpreserve-artwork) - Make changes with good commit messages:
- Use imperative voice and sentence case
- Be descriptive but concise
- Create a pull request with format:
PICARD-257: Allow preserving existing cover-art tags - Reference the issue in the PR description
- Keep PRs focused - split unrelated changes into separate PRs
- Use git rebase to clean up commits before merging
See Picard Documentation project for contributing to the Picard User Guide.
See po/README.md for translation information.
When implementing tag support, aim for compatibility with existing software.
- ID3
- VorbisComment
- OggOpus (in addition to Vorbis Comment spec)
- RFC 7845 - Ogg Encapsulation for the Opus Audio Codec
- APE-Tags
- Matroska Tags
- ASF / WMA
- MP4: See iTunes Metadata Format Specification (was available at Apple Developer website, but does not seem to be available anymore)
- RIFF Tags / Resource Interchange File Format: INFO List Chunk / Multimedia Programming Interface and Data Specifications 1.0
- Mutagen Spec Collection
- Picard Tag Mapping
- JAudiotagger
- MP3Tag
- Kid3
- Yate Tag Mapping Table
- MediaMonkey
- MusicBee
- Kodi - Music Files & Tagging
- Kodi - Video file tagging
- Quod Libet - Tag Formats & Spec Deviations
- TagLib Mapping of Properties
- Foobar2000:ID3 Tag Mapping - Hydrogenaudio Knowledgebase
- Tag Mapping - Hydrogenaudio Knowledgebase
- Windows
- SlimServerSupportedTags - SqueezeboxWiki
- Music Player Daemon 0.21.2 documentation
- Metadata Matrix – Pioneer DJ
- DJ apps metadata matrix
- Navidrome mappings.yaml