<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Dipak Tiwari</title>
    <description>The latest articles on DEV Community by Dipak Tiwari (@dipak_tiwari_97d51537bdb7).</description>
    <link>https://dev.to/dipak_tiwari_97d51537bdb7</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3967656%2F15d6bf14-4f11-45c6-86a7-efe60aaded3d.jpg</url>
      <title>DEV Community: Dipak Tiwari</title>
      <link>https://dev.to/dipak_tiwari_97d51537bdb7</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/dipak_tiwari_97d51537bdb7"/>
    <language>en</language>
    <item>
      <title>How I got officially acknowledged as a MusicBrainz Picard contributor</title>
      <dc:creator>Dipak Tiwari</dc:creator>
      <pubDate>Thu, 04 Jun 2026 06:57:43 +0000</pubDate>
      <link>https://dev.to/dipak_tiwari_97d51537bdb7/how-i-got-officially-acknowledged-as-a-musicbrainz-picard-contributor-4fd2</link>
      <guid>https://dev.to/dipak_tiwari_97d51537bdb7/how-i-got-officially-acknowledged-as-a-musicbrainz-picard-contributor-4fd2</guid>
      <description>&lt;h1&gt;
  
  
  From a Research Rabbit Hole to an Official Open Source Acknowledgement
&lt;/h1&gt;

&lt;p&gt;A few months ago, my name appeared on the official MusicBrainz Picard acknowledgements page. Not as a user. As a contributor.&lt;/p&gt;

&lt;p&gt;This is the story of how that happened — the 15+ merged PRs across two repos, what I learned working with production-grade maintainers, and what the whole thing actually cost me in failed attempts before anything clicked.&lt;/p&gt;




&lt;h2&gt;
  
  
  What is MusicBrainz Picard?
&lt;/h2&gt;

&lt;p&gt;If you've ever properly tagged your music library, you might have used Picard without knowing it. It's the official MusicBrainz tagger — a cross-platform desktop application that identifies audio files using AcoustID fingerprints, fetches metadata from the MusicBrainz database, and renames/tags your files according to rules you define.&lt;/p&gt;

&lt;p&gt;It's not a toy project. Picard has millions of users, a complex file lifecycle engine, and is maintained by professional developers with incredibly high standards for code review. Getting a PR merged here means your code runs on real user machines.&lt;/p&gt;




&lt;h2&gt;
  
  
  How It Actually Started
&lt;/h2&gt;

&lt;p&gt;None of this was planned.&lt;/p&gt;

&lt;p&gt;It began with a research problem — I wanted to save disfluencies in a Whisper speech model. That rabbit hole led me to GailBot, an official Python package for linguistic analysis, which pulled me toward GSoC. I didn't get in. So I pivoted.&lt;/p&gt;

&lt;p&gt;MetaBrainz wasn't even on my radar until I started looking for projects where Python actually mattered at the core. I found Picard, read the codebase for a week, identified areas where the file lifecycle logic was fragile, and started filing PRs.&lt;/p&gt;

&lt;p&gt;None of the early ones were easy. The first few reviews sent me back to square one. But every rejection taught me something the previous one couldn't.&lt;/p&gt;




&lt;h2&gt;
  
  
  How I Started Contributing
&lt;/h2&gt;

&lt;p&gt;I wasn't handed a "good first issue" list and told to pick something easy. The approach I took:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Understand the &lt;em&gt;why&lt;/em&gt; before touching the &lt;em&gt;what&lt;/em&gt;. Picard's file lifecycle is subtle — files move between states (pending, loaded, saved, error), and getting that wrong causes data loss for real users.&lt;/li&gt;
&lt;li&gt;Write tests before the maintainers ask for them. Every PR I submitted had pytest coverage using mock objects.&lt;/li&gt;
&lt;li&gt;Respect CI/CD strictly. The project enforces formatting and linting via &lt;code&gt;ruff&lt;/code&gt;. I treated every pipeline failure as a blocker, not a suggestion.&lt;/li&gt;
&lt;li&gt;Keep scope tight. Each PR does exactly one thing. The maintainers will make you split it if you don't.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  What I Actually Built
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Picard — File Safety &amp;amp; Error Handling
&lt;/h3&gt;

&lt;p&gt;This is where most of my work landed. Picard's file save pipeline is mission-critical — if it fails silently, users lose data. I focused on making failures loud, explicit, and recoverable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/metabrainz/picard/pull/2933" rel="noopener noreferrer"&gt;#2933&lt;/a&gt; — Improve error messages for file access errors&lt;/strong&gt;&lt;br&gt;
The existing error messages when Picard couldn't access a file were vague and unhelpful. This PR made them specific — telling users exactly what failed and why, rather than a generic "something went wrong."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/metabrainz/picard/pull/2954" rel="noopener noreferrer"&gt;#2954&lt;/a&gt; — Docs: set error docstring&lt;/strong&gt;&lt;br&gt;
Small but important. Properly documenting the error states in the codebase so future contributors (and future me) understand what each error condition actually means.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/metabrainz/picard/pull/2963" rel="noopener noreferrer"&gt;#2963&lt;/a&gt; — Detect external file change&lt;/strong&gt; &lt;em&gt;(Feature — 34 review comments)&lt;/em&gt;&lt;br&gt;
This was the hardest one. Picard watches files on disk. If something external modifies a file while Picard has it loaded, the save pipeline could silently overwrite those external changes. This PR added explicit detection of external file changes as a first-class step in the pipeline — not a side effect hidden in unrelated code paths. 34 comments in review. Multiple rewrites. Close collaboration with the lead maintainer zas to get the logic exactly right. Worth every cycle.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/metabrainz/picard/pull/3005" rel="noopener noreferrer"&gt;#3005&lt;/a&gt; — Add regression test for replaced file with same size and different content&lt;/strong&gt;&lt;br&gt;
After the external file change detection landed, I wrote regression tests to make sure it stayed correct. This one covers the tricky edge case where a file is replaced with one of the same size — easy to miss with naive change detection.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/metabrainz/picard/pull/3009" rel="noopener noreferrer"&gt;#3009&lt;/a&gt; — Add regression test for file deleted after identity capture&lt;/strong&gt;&lt;br&gt;
Another regression test covering the case where a file is deleted between Picard capturing its identity and attempting to process it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/metabrainz/picard/pull/3010" rel="noopener noreferrer"&gt;#3010&lt;/a&gt; — Test file deleted after capture&lt;/strong&gt;&lt;br&gt;
Complementary test to #3009, covering the deletion scenario from a different code path angle.&lt;/p&gt;

&lt;h3&gt;
  
  
  Picard — Platform &amp;amp; Tag Support
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/metabrainz/picard/pull/3044" rel="noopener noreferrer"&gt;#3044&lt;/a&gt; — macOS: Fix background-only app by disabling console for exe_plugins&lt;/strong&gt;&lt;br&gt;
Picard was spawning a visible console window on macOS when launching external plugins — a genuine UX bug for Mac users. This PR fixed it by properly disabling console allocation for the exe_plugins subprocess on macOS.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/metabrainz/picard/pull/3047" rel="noopener noreferrer"&gt;#3047&lt;/a&gt; — Fix: incorrect comment in FileIdentity hash test&lt;/strong&gt;&lt;br&gt;
The comment in the FileIdentity hash test was wrong — it described behavior that the test wasn't actually testing. Fixed the comment to accurately describe what the assertion was checking.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/metabrainz/picard/pull/3058" rel="noopener noreferrer"&gt;#3058&lt;/a&gt; — PICARD-2383: Add musicbrainz_composerid tag&lt;/strong&gt;&lt;br&gt;
MusicBrainz has a &lt;code&gt;composer_id&lt;/code&gt; field in its database. Picard wasn't exposing it as a tag. This PR added &lt;code&gt;musicbrainz_composerid&lt;/code&gt; as a writable tag, making composer metadata accessible to users who care about attribution at that level of detail because of this contribution maintainer add my name of official acknowledgement page.&lt;/p&gt;




&lt;h3&gt;
  
  
  mcp-musicbrainz — Building AI Tools on Top of the MusicBrainz API
&lt;/h3&gt;

&lt;p&gt;In parallel, I contributed to &lt;strong&gt;&lt;a href="https://github.com/zas/mcp-musicbrainz" rel="noopener noreferrer"&gt;zas/mcp-musicbrainz&lt;/a&gt;&lt;/strong&gt; — an MCP (Model Context Protocol) server that lets AI assistants query the MusicBrainz database directly. Think: Claude or any LLM asking "find me all recordings by this artist" and getting real structured data back.&lt;/p&gt;

&lt;p&gt;This was where my LLM tooling interest and my MusicBrainz knowledge intersected directly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/zas/mcp-musicbrainz/pull/1" rel="noopener noreferrer"&gt;#1&lt;/a&gt; — feat: add get_release_group_cover_art tool and handle 404s&lt;/strong&gt;&lt;br&gt;
The first PR — added a tool for fetching cover art for release groups, with proper 404 handling so the LLM gets a clean response instead of an error when cover art doesn't exist.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/zas/mcp-musicbrainz/pull/2" rel="noopener noreferrer"&gt;#2&lt;/a&gt; — feat: add detail tools for event, instrument, place, and series&lt;/strong&gt;&lt;br&gt;
Extended the server's entity coverage. MusicBrainz tracks events, instruments, places, and series — none of these were queryable via the MCP server. This PR added detail lookup tools for all four.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/zas/mcp-musicbrainz/pull/6" rel="noopener noreferrer"&gt;#6&lt;/a&gt; — feat: add industry standard translation tools for ISRC and ISWC&lt;/strong&gt;&lt;br&gt;
ISRC (International Standard Recording Code) and ISWC (International Standard Musical Work Code) are industry identifiers used by Spotify, Apple Music, and publishers. This PR added tools that translate between these commercial codes and MusicBrainz's open database entities — enabling LLM agents to bridge commercial music APIs and open data.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/zas/mcp-musicbrainz/pull/7" rel="noopener noreferrer"&gt;#7&lt;/a&gt; — add offset parameter to search tools to enable LLM pagination&lt;/strong&gt;&lt;br&gt;
The MusicBrainz API returns paginated results. Without pagination support, an LLM agent could only see the first page of any search. This PR added offset parameters to the search tools, enabling agents to autonomously crawl through deep result sets without hitting rate limits.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/zas/mcp-musicbrainz/pull/18" rel="noopener noreferrer"&gt;#18&lt;/a&gt; — feat: add SSE transport entry point using native fastmcp&lt;/strong&gt;&lt;br&gt;
Added Server-Sent Events (SSE) transport support using the native fastmcp implementation — making the server compatible with more MCP client configurations.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Official Acknowledgement
&lt;/h2&gt;

&lt;p&gt;After the Picard PRs were merged, I found my name listed on the official acknowledgements page:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://picard-docs.musicbrainz.org/en/latest/about_picard/acknowledgements.html" rel="noopener noreferrer"&gt;https://picard-docs.musicbrainz.org/en/latest/about_picard/acknowledgements.html&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That URL is not self-reported. It's maintained by the MetaBrainz Foundation and updated by the project maintainers themselves. It means the people who built Picard decided my contributions were worth recognizing.&lt;/p&gt;

&lt;p&gt;It's a small thing on one level. On another level, it's the first time a production open source project put my name on something real.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Working With Production Maintainers Actually Teaches You
&lt;/h2&gt;

&lt;p&gt;There's a gap between "I can write Python" and "I can contribute to a production Python codebase." Here's what narrowed that gap for me:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Code review is a conversation, not a verdict.&lt;/strong&gt; zas doesn't just comment "fix this" — he explains &lt;em&gt;why&lt;/em&gt; the current approach is wrong and what the correct mental model should be. Reading those review comments carefully is like getting a mini-lesson in software engineering every PR. The #2963 PR with 34 comments was the best education I've had this year.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mock objects are not optional.&lt;/strong&gt; When you're testing file system operations, you mock the filesystem. When you're testing the save pipeline, you mock the file states. The test suite has to be deterministic and fast, always. If your test touches real disk, you've already failed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CI/CD is the real gatekeeper.&lt;/strong&gt; You can write great code, but if your formatting doesn't match &lt;code&gt;ruff&lt;/code&gt; or your test coverage drops, the PR isn't moving. Internalize the pipeline, don't fight it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Scope discipline matters.&lt;/strong&gt; Each PR should do exactly one thing. I learned this the hard way when early drafts tried to fix related issues I noticed while working on something else. Split it. Always.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The codebase is the documentation.&lt;/strong&gt; Production projects don't have tutorials for contributors. You read the code, you read the tests, you read the commit history. That's how you learn what the project actually values.&lt;/p&gt;




&lt;h2&gt;
  
  
  How It All Started (The Real Story)
&lt;/h2&gt;

&lt;p&gt;This journey has been full of ups and downs.&lt;/p&gt;

&lt;p&gt;It began with a research problem — saving disfluencies in a Whisper model. That led me to GailBot, an official Python package for linguistic analysis. GailBot led me toward GSoC. GSoC didn't work out. So I pivoted to MetaBrainz.&lt;/p&gt;

&lt;p&gt;None of that was linear. There were rejected applications, PRs that sat for weeks, and review comments that felt harsh until I realized they were right. But every pivot taught me something the previous one couldn't. The Whisper research taught me to read academic codebases. GailBot taught me Python packaging. Picard taught me production engineering discipline.&lt;/p&gt;

&lt;p&gt;The thread connecting all of it was just showing up and doing the work.&lt;/p&gt;




&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;p&gt;I'm currently targeting the &lt;strong&gt;CNCF LFX Mentorship September 2026 cohort&lt;/strong&gt;, specifically &lt;strong&gt;KubeEdge/Ianvs&lt;/strong&gt; — a distributed AI benchmarking platform for edge computing built in pure Python. It sits exactly at the intersection of everything I've been learning: Python, ML pipelines, and cloud-native infrastructure.&lt;/p&gt;

&lt;p&gt;I'm also building &lt;strong&gt;Repo Maintainer AI&lt;/strong&gt; — a FastAPI-based GitHub App that automates PR reviews and contributor onboarding for open source projects. The problem I kept running into as a contributor is exactly what this tool solves.&lt;/p&gt;




&lt;h2&gt;
  
  
  Advice If You're Starting Out
&lt;/h2&gt;

&lt;p&gt;Don't optimize for easy issues. Optimize for understanding.&lt;/p&gt;

&lt;p&gt;Find a project you genuinely use or care about. Read the codebase until you understand something that's fragile or missing. Then fix it properly — with tests, with attention to CI, with patience for review cycles that take longer than you'd like.&lt;/p&gt;

&lt;p&gt;The acknowledgement comes from the work. Do the work first.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Find me on GitHub at &lt;a href="https://github.com/iron-prog" rel="noopener noreferrer"&gt;github.com/iron-prog&lt;/a&gt; and LinkedIn at &lt;a href="https://www.linkedin.com/in/deepak-tiwari-dev/" rel="noopener noreferrer"&gt;linkedin.com/in/deepak-tiwari-dev&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>devjournal</category>
      <category>learning</category>
      <category>opensource</category>
      <category>softwaredevelopment</category>
    </item>
  </channel>
</rss>
