[{"data":1,"prerenderedAt":5718},["ShallowReactive",2],{"navigation":3,"/blog/music-data/scout-isrc-metadata-enrichment-spotify-musicbrainz-post":734,"/blog/music-data/scout-isrc-metadata-enrichment-spotify-musicbrainz-surround":1478,"/blog/music-data/scout-isrc-metadata-enrichment-spotify-musicbrainz-related":1483},[4,70,207,312,721],{"title":5,"path":6,"stem":7,"children":8,"page":69},"Case Study","/blog/case-study","blog/case-study",[9,13,17,21,25,29,33,37,41,45,49,53,57,61,65],{"title":10,"path":11,"stem":12},"Ambistream – Multi-Layer Streaming Platform","/blog/case-study/ambistream-building-a-multi-layer-streaming-platform-from-a-spark-of-an-idea","blog/case-study/ambistream-building-a-multi-layer-streaming-platform-from-a-spark-of-an-idea",{"title":14,"path":15,"stem":16},"Custom Chromecast & AirPlay Casting App","/blog/case-study/chromecast-airplay-casting-app-case-study","blog/case-study/chromecast-airplay-casting-app-case-study",{"title":18,"path":19,"stem":20},"Direct Music Licensing Platform Case Study","/blog/case-study/dlm-music-catalog-case-study","blog/case-study/dlm-music-catalog-case-study",{"title":22,"path":23,"stem":24},"Assembly Instructions App - Galeco Mobile App","/blog/case-study/galeco-mobile-app-case-study","blog/case-study/galeco-mobile-app-case-study",{"title":26,"path":27,"stem":28},"MemoSonic: Building an Audio Memory Game","/blog/case-study/how-we-built-memosonic-accessible-audio-memory-game-flutter","blog/case-study/how-we-built-memosonic-accessible-audio-memory-game-flutter",{"title":30,"path":31,"stem":32},"Loyalty Program App for Shopping Mall","/blog/case-study/loyalty-program-application-case-study","blog/case-study/loyalty-program-application-case-study",{"title":34,"path":35,"stem":36},"Mobile Application for Music Catalogs","/blog/case-study/mobile-app-for-music-catalog","blog/case-study/mobile-app-for-music-catalog",{"title":38,"path":39,"stem":40},"Universal Music Data Parser for 20+ Platforms","/blog/case-study/musicdata-lab-universal-music-data-parser-case-study","blog/case-study/musicdata-lab-universal-music-data-parser-case-study",{"title":42,"path":43,"stem":44},"Panther ML/AI Pricing Recommendation Tool","/blog/case-study/panther-pricing-recommendation-tool-case-study","blog/case-study/panther-pricing-recommendation-tool-case-study",{"title":46,"path":47,"stem":48},"4D Grupa Roofing Wholesalers Platform","/blog/case-study/roofing-wholesalers-website-case-study","blog/case-study/roofing-wholesalers-website-case-study",{"title":50,"path":51,"stem":52},"Talent Alpha HR Frontend Platform","/blog/case-study/talent-alpha-hr-platform-case-study","blog/case-study/talent-alpha-hr-platform-case-study",{"title":54,"path":55,"stem":56},"Ticketing & Events Platform Development","/blog/case-study/ticketing-events-platform-case-study","blog/case-study/ticketing-events-platform-case-study",{"title":58,"path":59,"stem":60},"Turn Fans into Superfans — Roadie.co","/blog/case-study/turn-fans-into-superfans-roadie-co","blog/case-study/turn-fans-into-superfans-roadie-co",{"title":62,"path":63,"stem":64},"Walkative 2.0 Global Booking Engine","/blog/case-study/walkative-2-booking-platform-case-study","blog/case-study/walkative-2-booking-platform-case-study",{"title":66,"path":67,"stem":68},"Why Merch Is the New Royalty Check, and How Tech Is Closing the Gap","/blog/case-study/why-merch-is-the-new-royalty-check","blog/case-study/why-merch-is-the-new-royalty-check",false,{"title":71,"path":72,"stem":73,"children":74,"page":69},"Music Data","/blog/music-data","blog/music-data",[75,79,83,87,91,95,99,103,107,111,115,119,123,127,131,135,139,143,147,151,155,159,163,167,171,175,179,183,187,191,195,199,203],{"title":76,"path":77,"stem":78},"13 Distributors, 5 File Formats, Zero Standards -The Reality of Music Royalty Data","/blog/music-data/13-distributors-5-file-formats-zero-standards-the-reality-of-music-royalty-data","blog/music-data/13-distributors-5-file-formats-zero-standards-the-reality-of-music-royalty-data",{"title":80,"path":81,"stem":82},"830 Ways to Say Spotify - Normalizing Music Streaming Data","/blog/music-data/830-ways-to-say-spotify-normalizing-music-streaming-data","blog/music-data/830-ways-to-say-spotify-normalizing-music-streaming-data",{"title":84,"path":85,"stem":86},"Why Music Companies Need AI-Powered Analytics (And How We Built One)","/blog/music-data/ai-powered-analytics-dashboard-django-clickhouse-ollama","blog/music-data/ai-powered-analytics-dashboard-django-clickhouse-ollama",{"title":88,"path":89,"stem":90},"AI Rehearsal: Spaced Repetition for Your Musical Ideas","/blog/music-data/ai-rehearsal-spaced-repetition-for-musical-ideas","blog/music-data/ai-rehearsal-spaced-repetition-for-musical-ideas",{"title":92,"path":93,"stem":94},"Audio Project Organization Is a Mess — Here's Why","/blog/music-data/audio-project-organization-mess","blog/music-data/audio-project-organization-mess",{"title":96,"path":97,"stem":98},"Why Audio Search Is Still Broken and How to Fix It with Embeddings","/blog/music-data/audio-search-broken-fix-with-embeddings","blog/music-data/audio-search-broken-fix-with-embeddings",{"title":100,"path":101,"stem":102},"AI Song Structure Analysis: Intro, Verse, Chorus","/blog/music-data/automatic-song-structure-analysis-how-ai-detects-intro-verse-chorus","blog/music-data/automatic-song-structure-analysis-how-ai-detects-intro-verse-chorus",{"title":104,"path":105,"stem":106},"The Broken Feedback Loop in Music Collaboration","/blog/music-data/broken-feedback-loop-music-collaboration","blog/music-data/broken-feedback-loop-music-collaboration",{"title":108,"path":109,"stem":110},"Building a Claude Skill for DDEX Validation: Automate Music Metadata Checks with AI","/blog/music-data/building-a-claude-skill-for-ddex-validation-music-metadata","blog/music-data/building-a-claude-skill-for-ddex-validation-music-metadata",{"title":112,"path":113,"stem":114},"Building a Custom Music Delivery Platform on the Revelator API","/blog/music-data/building-a-custom-music-delivery-platform-on-the-revelator-api","blog/music-data/building-a-custom-music-delivery-platform-on-the-revelator-api",{"title":116,"path":117,"stem":118},"Building a Suno AI Remix App with Nuxt & Firebase","/blog/music-data/building-a-suno-remix-app-with-nuxt-and-firebase","blog/music-data/building-a-suno-remix-app-with-nuxt-and-firebase",{"title":120,"path":121,"stem":122},"C2PA & DDEX: Authenticity Meets Rights in the Age of AI Music","/blog/music-data/c2pa-and-ddex-authenticity-meets-rights-in-the-age-of-ai-music","blog/music-data/c2pa-and-ddex-authenticity-meets-rights-in-the-age-of-ai-music",{"title":124,"path":125,"stem":126},"C2PA in Music: A Claude MCP for Reading Content Provenance","/blog/music-data/c2pa-in-music-mcp","blog/music-data/c2pa-in-music-mcp",{"title":128,"path":129,"stem":130},"Data Modeling in MongoDB Using Design Patterns","/blog/music-data/data-modeling-in-mongodb-with-the-usage-of-design-patterns","blog/music-data/data-modeling-in-mongodb-with-the-usage-of-design-patterns",{"title":132,"path":133,"stem":134},"Office Hours with MusicTech Lab's DDEX Expert","/blog/music-data/ddex-office-hours-musictech","blog/music-data/ddex-office-hours-musictech",{"title":136,"path":137,"stem":138},"DDEX Open Source Projects Review","/blog/music-data/ddex-open-source-projects-review","blog/music-data/ddex-open-source-projects-review",{"title":140,"path":141,"stem":142},"Extracting Data from Ableton .als and .asd Files","/blog/music-data/extracting-data-from-ableton-als-asd-files","blog/music-data/extracting-data-from-ableton-als-asd-files",{"title":144,"path":145,"stem":146},"Maciej Dulski on Sound Connections Podcast","/blog/music-data/from-startups-to-musictech-maciej-dulski-on-sound-connections-podcast","blog/music-data/from-startups-to-musictech-maciej-dulski-on-sound-connections-podcast",{"title":148,"path":149,"stem":150},"How to Transcribe Video to Text Using OpenAI Whisper","/blog/music-data/how-to-transcribe-video-to-text-using-whisper","blog/music-data/how-to-transcribe-video-to-text-using-whisper",{"title":152,"path":153,"stem":154},"Epidemic Sound MCP with Claude for Devs","/blog/music-data/how-to-use-epidemic-sound-mcp-with-claude","blog/music-data/how-to-use-epidemic-sound-mcp-with-claude",{"title":156,"path":157,"stem":158},"Hybrid Database Model in Django for Speed","/blog/music-data/hybrid-database-model-in-django-as-a-performance-booster","blog/music-data/hybrid-database-model-in-django-as-a-performance-booster",{"title":160,"path":161,"stem":162},"Introduction to generating DDEX file using Python","/blog/music-data/introduction-to-generating-ddex-file-using-python","blog/music-data/introduction-to-generating-ddex-file-using-python",{"title":164,"path":165,"stem":166},"Maintaining Music Tech Tools: The SLA Dilemma for Small Teams","/blog/music-data/maintaining-music-tech-tools-the-sla-dilemma-for-small-teams","blog/music-data/maintaining-music-tech-tools-the-sla-dilemma-for-small-teams",{"title":168,"path":169,"stem":170},"Querying Bandcamp Revenue Reports with Natural Language — Meet mtl-bandcamp-mcp","/blog/music-data/mtl-bandcamp-mcp-open-source-revenue-dashboard","blog/music-data/mtl-bandcamp-mcp-open-source-revenue-dashboard",{"title":172,"path":173,"stem":174},"mtl-metadata-mcp: Open Source Audio Metadata Embedding for Claude Code","/blog/music-data/mtl-metadata-mcp-open-source-audio-metadata-embedding","blog/music-data/mtl-metadata-mcp-open-source-audio-metadata-embedding",{"title":176,"path":177,"stem":178},"MusicTech Resources for Builders","/blog/music-data/musictech-resources-curated-insights-for-the-musictech-builders","blog/music-data/musictech-resources-curated-insights-for-the-musictech-builders",{"title":180,"path":181,"stem":182},"Poland's Creative Tech and MusicTech Rise","/blog/music-data/polands-creative-tech-sector-is-on-the-rise-and-musictech-is-part-of-it","blog/music-data/polands-creative-tech-sector-is-on-the-rise-and-musictech-is-part-of-it",{"title":184,"path":185,"stem":186},"Batch ISRC Enrichment That Turns Messy Catalogs Into Clean Data","/blog/music-data/scout-isrc-metadata-enrichment-spotify-musicbrainz","blog/music-data/scout-isrc-metadata-enrichment-spotify-musicbrainz",{"title":188,"path":189,"stem":190},"Music Self-Publishing: The Emuze.me Story","/blog/music-data/self-publishing-in-the-music-industry-a-tale-of-emuze-me","blog/music-data/self-publishing-in-the-music-industry-a-tale-of-emuze-me",{"title":192,"path":193,"stem":194},"Understanding the API First Approach","/blog/music-data/understanding-the-api-first-approach","blog/music-data/understanding-the-api-first-approach",{"title":196,"path":197,"stem":198},"The Voice Memo Graveyard Problem","/blog/music-data/voice-memo-graveyard-problem","blog/music-data/voice-memo-graveyard-problem",{"title":200,"path":201,"stem":202},"Which Database for Music Data? Redshift vs BigQuery vs ClickHouse and When to Use Each","/blog/music-data/which-database-for-music-data-redshift-vs-bigquery-vs-clickhouse","blog/music-data/which-database-for-music-data-redshift-vs-bigquery-vs-clickhouse",{"title":204,"path":205,"stem":206},"Why we decided to use wavesurfer.js","/blog/music-data/why-we-decided-to-use-wavesurfer","blog/music-data/why-we-decided-to-use-wavesurfer",{"title":208,"path":209,"stem":210,"children":211,"page":69},"Newsletter","/blog/newsletter","blog/newsletter",[212,216,220,224,228,232,236,240,244,248,252,256,260,264,268,272,276,280,284,288,292,296,300,304,308],{"title":213,"path":214,"stem":215},"Music Industry Tech Openings (April 2024 Update)","/blog/newsletter/music-industry-tech-openings-april-2024-update","blog/newsletter/music-industry-tech-openings-april-2024-update",{"title":217,"path":218,"stem":219},"Music Industry Tech Openings (April 2025 Update)","/blog/newsletter/music-industry-tech-openings-april-2025-update","blog/newsletter/music-industry-tech-openings-april-2025-update",{"title":221,"path":222,"stem":223},"Music Industry Tech Openings (August 2024 Update)","/blog/newsletter/music-industry-tech-openings-august-2024-update","blog/newsletter/music-industry-tech-openings-august-2024-update",{"title":225,"path":226,"stem":227},"Music Industry Tech Openings (December 2024 Update)","/blog/newsletter/music-industry-tech-openings-december-2024-update","blog/newsletter/music-industry-tech-openings-december-2024-update",{"title":229,"path":230,"stem":231},"Music Industry Tech Openings (February 2025 Update)","/blog/newsletter/music-industry-tech-openings-february-2025-update","blog/newsletter/music-industry-tech-openings-february-2025-update",{"title":233,"path":234,"stem":235},"Music Industry Tech Openings (January 2025 Update)","/blog/newsletter/music-industry-tech-openings-january-2025-update","blog/newsletter/music-industry-tech-openings-january-2025-update",{"title":237,"path":238,"stem":239},"Music Industry Tech Openings (July 2024 Update)","/blog/newsletter/music-industry-tech-openings-july-2024-update","blog/newsletter/music-industry-tech-openings-july-2024-update",{"title":241,"path":242,"stem":243},"Music Industry Tech Openings (June 2024 Update)","/blog/newsletter/music-industry-tech-openings-june-2024-update","blog/newsletter/music-industry-tech-openings-june-2024-update",{"title":245,"path":246,"stem":247},"Music Industry Tech Openings (March 2025 Update)","/blog/newsletter/music-industry-tech-openings-march-2025-update","blog/newsletter/music-industry-tech-openings-march-2025-update",{"title":249,"path":250,"stem":251},"Music Industry Tech Openings (May 2024 Update)","/blog/newsletter/music-industry-tech-openings-may-2024-update","blog/newsletter/music-industry-tech-openings-may-2024-update",{"title":253,"path":254,"stem":255},"Music Industry Tech Openings (May 2025 Update)","/blog/newsletter/music-industry-tech-openings-may-2025","blog/newsletter/music-industry-tech-openings-may-2025",{"title":257,"path":258,"stem":259},"Music Industry Tech Openings (November 2024 Update)","/blog/newsletter/music-industry-tech-openings-november-2024-update","blog/newsletter/music-industry-tech-openings-november-2024-update",{"title":261,"path":262,"stem":263},"Music Industry Tech Openings (October 2024 Update)","/blog/newsletter/music-industry-tech-openings-october-2024-update","blog/newsletter/music-industry-tech-openings-october-2024-update",{"title":265,"path":266,"stem":267},"Music Industry Tech Openings (September 2024 Update)","/blog/newsletter/music-industry-tech-openings-september-2024-update","blog/newsletter/music-industry-tech-openings-september-2024-update",{"title":269,"path":270,"stem":271},"MusicTech Insights #1 by Maciej Dulski","/blog/newsletter/musictech-insights-1-curated-by-maciej-dulski","blog/newsletter/musictech-insights-1-curated-by-maciej-dulski",{"title":273,"path":274,"stem":275},"Provenance, Not Detection, Is the Durable Answer","/blog/newsletter/musictech-insights-10-curated-by-jim-anderson","blog/newsletter/musictech-insights-10-curated-by-jim-anderson",{"title":277,"path":278,"stem":279},"What CMOs can teach us about innovation in uncertain times","/blog/newsletter/musictech-insights-10-curated-by-joanna-kurkowska","blog/newsletter/musictech-insights-10-curated-by-joanna-kurkowska",{"title":281,"path":282,"stem":283},"Feeling the MusicTech Momentum","/blog/newsletter/musictech-insights-2-curated-by-maciej-dulski","blog/newsletter/musictech-insights-2-curated-by-maciej-dulski",{"title":285,"path":286,"stem":287},"AI in Music: Hype, Hope, and a Human Touch","/blog/newsletter/musictech-insights-3-curated-by-drew-thurlow","blog/newsletter/musictech-insights-3-curated-by-drew-thurlow",{"title":289,"path":290,"stem":291},"The Music Metadata Conundrum","/blog/newsletter/musictech-insights-4-curated-by-amanda-schupf","blog/newsletter/musictech-insights-4-curated-by-amanda-schupf",{"title":293,"path":294,"stem":295},"7 Rounds in the First 10 Days of November 2025","/blog/newsletter/musictech-insights-5-curated-by-maciej-dulski","blog/newsletter/musictech-insights-5-curated-by-maciej-dulski",{"title":297,"path":298,"stem":299},"The End of an Era: It's All About to Crash","/blog/newsletter/musictech-insights-6-curated-by-sigurdur-arnason","blog/newsletter/musictech-insights-6-curated-by-sigurdur-arnason",{"title":301,"path":302,"stem":303},"Low-Code Magic Won't Solve MusicTech Reality","/blog/newsletter/musictech-insights-7-curated-by-mariusz-smenzyk","blog/newsletter/musictech-insights-7-curated-by-mariusz-smenzyk",{"title":305,"path":306,"stem":307},"The New Economics of Game Music","/blog/newsletter/musictech-insights-8-curated-by-kenny-vaughan","blog/newsletter/musictech-insights-8-curated-by-kenny-vaughan",{"title":309,"path":310,"stem":311},"Music Business Meets Direct-to-Fan","/blog/newsletter/musictech-insights-9-curated-by-yaw-asamani","blog/newsletter/musictech-insights-9-curated-by-yaw-asamani",{"title":313,"path":314,"stem":315,"children":316,"page":69},"Software Development","/blog/software-development","blog/software-development",[317,321,325,329,333,337,341,345,349,353,357,361,365,369,373,377,381,385,389,393,397,401,405,409,413,417,421,425,429,433,437,441,445,449,453,457,461,465,469,473,477,481,485,489,493,497,501,505,509,513,517,521,525,529,533,537,541,545,549,553,557,561,565,569,573,577,581,585,589,593,597,601,605,609,613,617,621,625,629,633,637,641,645,649,653,657,661,665,669,673,677,681,685,689,693,697,701,705,709,713,717],{"title":318,"path":319,"stem":320},"Benefits of Outsourcing Software Development","/blog/software-development/10-benefits-of-outsourcing-software-development-services","blog/software-development/10-benefits-of-outsourcing-software-development-services",{"title":322,"path":323,"stem":324},"10 Steps to Find the Best MVP Developers","/blog/software-development/10-steps-to-find-the-best-mvp-developers-for-your-startup-idea","blog/software-development/10-steps-to-find-the-best-mvp-developers-for-your-startup-idea",{"title":326,"path":327,"stem":328},"1,200 Looms Later: How Async Video Became My Development Superpower","/blog/software-development/1200-looms-how-async-video-became-our-development-superpower","blog/software-development/1200-looms-how-async-video-became-our-development-superpower",{"title":330,"path":331,"stem":332},"Communication Strategy in Outsourcing Projects","/blog/software-development/5-steps-to-implement-an-effective-communication-strategy-in-outsourcing-software-development-project","blog/software-development/5-steps-to-implement-an-effective-communication-strategy-in-outsourcing-software-development-project",{"title":334,"path":335,"stem":336},"7 Best Practices for Outsourcing Software Development","/blog/software-development/7-best-practices-for-outsourcing-software-development","blog/software-development/7-best-practices-for-outsourcing-software-development",{"title":338,"path":339,"stem":340},"9 Reasons Why Saleor.io Is Best for eCommerce","/blog/software-development/9-reasons-why-the-saleor-io-platform-is-the-best-choice-for-your-ecommerce-website","blog/software-development/9-reasons-why-the-saleor-io-platform-is-the-best-choice-for-your-ecommerce-website",{"title":342,"path":343,"stem":344},"A Look at Bravelab.io’s Clutch 2021 Year In Review","/blog/software-development/a-look-at-bravelab-ios-clutch-2021-year-in-review","blog/software-development/a-look-at-bravelab-ios-clutch-2021-year-in-review",{"title":346,"path":347,"stem":348},"A quick introduction to profit sharing implementation","/blog/software-development/a-quick-introduction-to-profit-sharing-implementation","blog/software-development/a-quick-introduction-to-profit-sharing-implementation",{"title":350,"path":351,"stem":352},"AI Audio Similarity Search: The Future of Sound Library Discovery","/blog/software-development/ai-audio-similarity-search-for-sound-libraries","blog/software-development/ai-audio-similarity-search-for-sound-libraries",{"title":354,"path":355,"stem":356},"Automate Repetitive Tasks for Better Results","/blog/software-development/automate-repetitive-tasks-to-improve-your-business-performance","blog/software-development/automate-repetitive-tasks-to-improve-your-business-performance",{"title":358,"path":359,"stem":360},"Automating Success: The Art of Unified Documentation","/blog/software-development/automating-success-the-art-of-unified-documentation","blog/software-development/automating-success-the-art-of-unified-documentation",{"title":362,"path":363,"stem":364},"Brave 3.0 Website Redesign, Part 2: Solution","/blog/software-development/brave-3-0-how-we-conducted-website-redesign-part-2-solution","blog/software-development/brave-3-0-how-we-conducted-website-redesign-part-2-solution",{"title":366,"path":367,"stem":368},"Brave 3.0, Part 4: Tech Stack and Recap","/blog/software-development/brave-3-0-part-4-technologies-behind-and-final-series-recap","blog/software-development/brave-3-0-part-4-technologies-behind-and-final-series-recap",{"title":370,"path":371,"stem":372},"Brave 3.0 – redesign process part 1. The Challenge","/blog/software-development/brave-3-0-redesign-process-part-1-challenge","blog/software-development/brave-3-0-redesign-process-part-1-challenge",{"title":374,"path":375,"stem":376},"Brave 3.0 – redesign process, part 3. Lesson learned","/blog/software-development/brave-3-0-redesign-process-part-3-lesson-learned","blog/software-development/brave-3-0-redesign-process-part-3-lesson-learned",{"title":378,"path":379,"stem":380},"Bravelab.io: Top Software Developer by Clutch","/blog/software-development/bravelab-io-is-recognized-as-a-top-custom-software-developer-by-clutch","blog/software-development/bravelab-io-is-recognized-as-a-top-custom-software-developer-by-clutch",{"title":382,"path":383,"stem":384},"Bravelab.io: Top Developer in Poland by Clutch","/blog/software-development/bravelab-io-named-top-software-developer-in-poland-by-clutch","blog/software-development/bravelab-io-named-top-software-developer-in-poland-by-clutch",{"title":386,"path":387,"stem":388},"MusicTech Lab Partners with LALAL.AI","/blog/software-development/bravelab-partners-with-the-audio-lalal-ai","blog/software-development/bravelab-partners-with-the-audio-lalal-ai",{"title":390,"path":391,"stem":392},"MusicTech Lab Partners with The Audio Programmer","/blog/software-development/bravelab-partners-with-the-audio-programmer","blog/software-development/bravelab-partners-with-the-audio-programmer",{"title":394,"path":395,"stem":396},"Bravelab's team about productivity","/blog/software-development/bravelabs-team-about-productivity","blog/software-development/bravelabs-team-about-productivity",{"title":398,"path":399,"stem":400},"Braveloper","/blog/software-development/braveloper","blog/software-development/braveloper",{"title":402,"path":403,"stem":404},"Bravely App: Boost Productivity with Django","/blog/software-development/bravely-app-how-to-be-more-productive-with-django-quick","blog/software-development/bravely-app-how-to-be-more-productive-with-django-quick",{"title":406,"path":407,"stem":408},"DIY MIDI Controller for Ableton with Arduino","/blog/software-development/building-a-diy-midi-controller-for-ableton-live-with-arduino","blog/software-development/building-a-diy-midi-controller-for-ableton-live-with-arduino",{"title":410,"path":411,"stem":412},"C2PA in Ableton: Making AI Music Provenance Visible Inside Your DAW","/blog/software-development/c2pa-in-ableton-max-for-live","blog/software-development/c2pa-in-ableton-max-for-live",{"title":414,"path":415,"stem":416},"Change Detection mechanism in Angular","/blog/software-development/change-detection-mechanism-in-angular","blog/software-development/change-detection-mechanism-in-angular",{"title":418,"path":419,"stem":420},"Communication Channels in Remote Work","/blog/software-development/comparison-of-the-communication-channels-in-remote-work","blog/software-development/comparison-of-the-communication-channels-in-remote-work",{"title":422,"path":423,"stem":424},"Connecting Your Max for Live Device to a Cloud API","/blog/software-development/connecting-your-max-for-live-device-to-a-cloud-api","blog/software-development/connecting-your-max-for-live-device-to-a-cloud-api",{"title":426,"path":427,"stem":428},"From Voice Memo to Studio: The Cross-Platform Problem for Creators","/blog/software-development/cross-platform-problem-for-creators","blog/software-development/cross-platform-problem-for-creators",{"title":430,"path":431,"stem":432},"Cultural transformation through the pandemic era","/blog/software-development/cultural-transformation-through-the-pandemic-era","blog/software-development/cultural-transformation-through-the-pandemic-era",{"title":434,"path":435,"stem":436},"D-Commerce Decoded: Cutting Through the Hype","/blog/software-development/d-commerce-decoded-cutting-through-the-hype","blog/software-development/d-commerce-decoded-cutting-through-the-hype",{"title":438,"path":439,"stem":440},"Dev Meeting 002: Intro to DDD","/blog/software-development/dev-meeting-002-introduction-to-domain-driven-design-ddd","blog/software-development/dev-meeting-002-introduction-to-domain-driven-design-ddd",{"title":442,"path":443,"stem":444},"Dev Meeting 003: Web3 Primer","/blog/software-development/dev-meeting-003-web3-primer","blog/software-development/dev-meeting-003-web3-primer",{"title":446,"path":447,"stem":448},"Dev Meeting 004: Introduction to Event Storming","/blog/software-development/dev-meeting-004-introduction-to-event-storming","blog/software-development/dev-meeting-004-introduction-to-event-storming",{"title":450,"path":451,"stem":452},"Dev Meeting 001: Kubernetes is a Framework","/blog/software-development/dev-meeting-kubernetes-is-a-framework","blog/software-development/dev-meeting-kubernetes-is-a-framework",{"title":454,"path":455,"stem":456},"Did You Know? 10 Developer Tips from Real Codebases","/blog/software-development/did-you-know-dev-tips-part-1","blog/software-development/did-you-know-dev-tips-part-1",{"title":458,"path":459,"stem":460},"10 Surprising MusicTech Facts (Part 2)","/blog/software-development/did-you-know-musictech-facts-part-2","blog/software-development/did-you-know-musictech-facts-part-2",{"title":462,"path":463,"stem":464},"Django-cms and GraphQL","/blog/software-development/django-cms-and-graphql","blog/software-development/django-cms-and-graphql",{"title":466,"path":467,"stem":468},"Does Zappa make it super easy?","/blog/software-development/does-zappa-make-it-super-easy","blog/software-development/does-zappa-make-it-super-easy",{"title":470,"path":471,"stem":472},"Establishing cooperation between Netlify and Bravelab","/blog/software-development/establishing-cooperation-between-netlify-and-bravelab","blog/software-development/establishing-cooperation-between-netlify-and-bravelab",{"title":474,"path":475,"stem":476},"Export Ableton Locators to JSON via Max for Live","/blog/software-development/exporting-ableton-live-locators-to-json-with-max-for-live","blog/software-development/exporting-ableton-live-locators-to-json-with-max-for-live",{"title":478,"path":479,"stem":480},"IT Outsourcing: Success and Failure Factors","/blog/software-development/factors-that-contribute-to-the-success-or-failure-of-an-it-outsourcing-project","blog/software-development/factors-that-contribute-to-the-success-or-failure-of-an-it-outsourcing-project",{"title":482,"path":483,"stem":484},"Flutter 2022 Strategy: Analyzing the Roadmap","/blog/software-development/flutter-strategy-for-2022-analyzing-the-new-flutter-roadmap","blog/software-development/flutter-strategy-for-2022-analyzing-the-new-flutter-roadmap",{"title":486,"path":487,"stem":488},"Git Better #1 — Commit Message Convention","/blog/software-development/git-better-1-see-more-with-a-commit-message-convention","blog/software-development/git-better-1-see-more-with-a-commit-message-convention",{"title":490,"path":491,"stem":492},"Hasura in action. How to use it with Django","/blog/software-development/hasura-in-action","blog/software-development/hasura-in-action",{"title":494,"path":495,"stem":496},"Holacracy why and where we are","/blog/software-development/holacracy-why-and-where-we-are","blog/software-development/holacracy-why-and-where-we-are",{"title":498,"path":499,"stem":500},"How does JavaScript work","/blog/software-development/how-does-javascript-work","blog/software-development/how-does-javascript-work",{"title":502,"path":503,"stem":504},"How important is good UX/UI design?","/blog/software-development/how-important-is-good-ux-ui-design","blog/software-development/how-important-is-good-ux-ui-design",{"title":506,"path":507,"stem":508},"How repetitive tasks impact your business","/blog/software-development/how-repetitive-tasks-impact-your-business","blog/software-development/how-repetitive-tasks-impact-your-business",{"title":510,"path":511,"stem":512},"Becoming a Vue.js Dev: Do Paid Trials Work?","/blog/software-development/how-to-become-a-vue-js-developer-and-whether-paid-trials-in-it-work-out","blog/software-development/how-to-become-a-vue-js-developer-and-whether-paid-trials-in-it-work-out",{"title":514,"path":515,"stem":516},"How to Build an MVP in 6 Steps","/blog/software-development/how-to-build-a-minimum-viable-product-mvp-in-6-steps","blog/software-development/how-to-build-a-minimum-viable-product-mvp-in-6-steps",{"title":518,"path":519,"stem":520},"How to conduct workshops for creative industry?","/blog/software-development/how-to-conduct-workshops-for-creative-industry","blog/software-development/how-to-conduct-workshops-for-creative-industry",{"title":522,"path":523,"stem":524},"How to easily create form in Angular","/blog/software-development/how-to-easily-create-form-in-angular","blog/software-development/how-to-easily-create-form-in-angular",{"title":526,"path":527,"stem":528},"How to export orders in Saleor.io to XLSX file","/blog/software-development/how-to-export-orders-in-saleor-io-to-xlsx-file","blog/software-development/how-to-export-orders-in-saleor-io-to-xlsx-file",{"title":530,"path":531,"stem":532},"Handling High Loads on E-Commerce Platforms","/blog/software-development/how-to-handle-high-loads-on-e-commerce-platform-with-ease","blog/software-development/how-to-handle-high-loads-on-e-commerce-platform-with-ease",{"title":534,"path":535,"stem":536},"How to launch Saleor.io shop instance within 40h","/blog/software-development/how-to-launch-saleor-io-shop-instance-within-40h","blog/software-development/how-to-launch-saleor-io-shop-instance-within-40h",{"title":538,"path":539,"stem":540},"First Steps to Build a Business Relationship","/blog/software-development/how-to-make-the-first-step-to-establish-a-business-relationship","blog/software-development/how-to-make-the-first-step-to-establish-a-business-relationship",{"title":542,"path":543,"stem":544},"Multi-Tenant Apps with Django and Saleor.io","/blog/software-development/how-to-manage-tenants-in-the-multitenant-app-based-on-django-tenants-and-saleor-io-platform","blog/software-development/how-to-manage-tenants-in-the-multitenant-app-based-on-django-tenants-and-saleor-io-platform",{"title":546,"path":547,"stem":548},"Notion Backup Tool Built in 3 Days with Python","/blog/software-development/how-we-built-a-notion-backup-tool-in-3-days-with-pythonvue-and-why","blog/software-development/how-we-built-a-notion-backup-tool-in-3-days-with-pythonvue-and-why",{"title":550,"path":551,"stem":552},"Important new features in Python 3.8","/blog/software-development/important-new-features-in-python-3-8","blog/software-development/important-new-features-in-python-3-8",{"title":554,"path":555,"stem":556},"Installing Proxmox on dedicated server from OVH","/blog/software-development/installing-proxmox-on-dedicated-server-from-ovh","blog/software-development/installing-proxmox-on-dedicated-server-from-ovh",{"title":558,"path":559,"stem":560},"Integrating SignNow E-Signatures into Your Django Application","/blog/software-development/integrating-signnow-e-signatures-into-your-django-application","blog/software-development/integrating-signnow-e-signatures-into-your-django-application",{"title":562,"path":563,"stem":564},"Tempus Metronome and GetSongBPM API","/blog/software-development/integrating-tempus-metronome-with-the-getsongbpm-api-what-bpm-really-means-and-how-to-use-it","blog/software-development/integrating-tempus-metronome-with-the-getsongbpm-api-what-bpm-really-means-and-how-to-use-it",{"title":566,"path":567,"stem":568},"Introducing MusicTech Poland","/blog/software-development/introducing-musictech-poland","blog/software-development/introducing-musictech-poland",{"title":570,"path":571,"stem":572},"Vue.js as a Frontend for Saleor.io","/blog/software-development/is-it-possible-to-use-vue-js-as-a-frontend-for-saleor-io-platform","blog/software-development/is-it-possible-to-use-vue-js-as-a-frontend-for-saleor-io-platform",{"title":574,"path":575,"stem":576},"Is your business ready for the cashless era?","/blog/software-development/is-your-business-ready-for-the-cashless-era","blog/software-development/is-your-business-ready-for-the-cashless-era",{"title":578,"path":579,"stem":580},"Is your face ready to buy?","/blog/software-development/is-your-face-ready-to-buy","blog/software-development/is-your-face-ready-to-buy",{"title":582,"path":583,"stem":584},"JS Frameworks: Trends and Opportunities","/blog/software-development/javascript-trending-frameworks-and-market-opportunities","blog/software-development/javascript-trending-frameworks-and-market-opportunities",{"title":586,"path":587,"stem":588},"Kanban Board: Boost Your Team Productivity","/blog/software-development/kanban-board-methodology-hack-your-companys-productivity","blog/software-development/kanban-board-methodology-hack-your-companys-productivity",{"title":590,"path":591,"stem":592},"Verified Human Cert MCP Server: Prove Your Music Is Human-Made, Right from the Terminal","/blog/software-development/mcp-verified-human-cert-open-source","blog/software-development/mcp-verified-human-cert-open-source",{"title":594,"path":595,"stem":596},"Migrating from TravisCI to Github Actions","/blog/software-development/migrating-from-travisci-to-github-actions","blog/software-development/migrating-from-travisci-to-github-actions",{"title":598,"path":599,"stem":600},"MusicTech Lab: Top Software Developer by Clutch","/blog/software-development/musictechlab-is-recognized-as-a-top-custom-software-developer-by-clutch","blog/software-development/musictechlab-is-recognized-as-a-top-custom-software-developer-by-clutch",{"title":602,"path":603,"stem":604},"MusicTech Lab x Verified Human: Building a Trust Layer for Human-Made Music","/blog/software-development/musictechlab_blog_verified_human_partnership","blog/software-development/musictechlab_blog_verified_human_partnership",{"title":606,"path":607,"stem":608},"MusicXML: Standard for Music Notation","/blog/software-development/musicxml-standard-for-music-notation-and-education","blog/software-development/musicxml-standard-for-music-notation-and-education",{"title":610,"path":611,"stem":612},"Only a few books but dozens of ideas","/blog/software-development/only-a-few-books-but-dozens-of-ideas","blog/software-development/only-a-few-books-but-dozens-of-ideas",{"title":614,"path":615,"stem":616},"Overdue Invoices and Issue Tracker Integration","/blog/software-development/overdue-invoices-integration-with-the-issue-tracking-system","blog/software-development/overdue-invoices-integration-with-the-issue-tracking-system",{"title":618,"path":619,"stem":620},"Performing SAML SSO using JWT in Django","/blog/software-development/performing-saml-sso-using-jwt-in-django","blog/software-development/performing-saml-sso-using-jwt-in-django",{"title":622,"path":623,"stem":624},"Progressive Web Apps for Mobile Development","/blog/software-development/progressive-web-apps-a-new-way-of-creating-mobile-application","blog/software-development/progressive-web-apps-a-new-way-of-creating-mobile-application",{"title":626,"path":627,"stem":628},"Recruitment System: Gmail, Jira, and CRM","/blog/software-development/recruitment-system-integrating-gmail-bravely-jira-slack-and-copper-crm","blog/software-development/recruitment-system-integrating-gmail-bravely-jira-slack-and-copper-crm",{"title":630,"path":631,"stem":632},"Scratch Me: Chrome Extension for Leads","/blog/software-development/scratch-me-a-simple-chrome-extension-which-will-increase-your-productivity","blog/software-development/scratch-me-a-simple-chrome-extension-which-will-increase-your-productivity",{"title":634,"path":635,"stem":636},"Scratch Me – integration with the Copper CRM","/blog/software-development/scratch-me-integration-with-the-copper-crm","blog/software-development/scratch-me-integration-with-the-copper-crm",{"title":638,"path":639,"stem":640},"SignNow MCP Server: E-Signatures Straight from Claude Code","/blog/software-development/signnow-mcp-server-e-signatures-from-claude-code","blog/software-development/signnow-mcp-server-e-signatures-from-claude-code",{"title":642,"path":643,"stem":644},"Music Industry Tech Openings (March 2024 Update)","/blog/software-development/technical-job-opportunities-in-the-music-industry","blog/software-development/technical-job-opportunities-in-the-music-industry",{"title":646,"path":647,"stem":648},"Thanks app – a Management 3.0 solution","/blog/software-development/thanks-app-a-management-3-0-solution","blog/software-development/thanks-app-a-management-3-0-solution",{"title":650,"path":651,"stem":652},"Colonial Pipeline Case: 7 Security Reminders","/blog/software-development/the-case-of-colonial-pipeline-and-7-security-reminders","blog/software-development/the-case-of-colonial-pipeline-and-7-security-reminders",{"title":654,"path":655,"stem":656},"The Evolution and Future of E-commerce Platforms","/blog/software-development/the-evolution-and-future-of-e-commerce-platforms","blog/software-development/the-evolution-and-future-of-e-commerce-platforms",{"title":658,"path":659,"stem":660},"The Gender Gap in the Tech Industry","/blog/software-development/the-gender-gap-in-the-tech-industry","blog/software-development/the-gender-gap-in-the-tech-industry",{"title":662,"path":663,"stem":664},"First Attempt to Implement 4DX at Bravelab.io","/blog/software-development/the-very-first-attempt-to-implement-4dx-in-bravelab-io","blog/software-development/the-very-first-attempt-to-implement-4dx-in-bravelab-io",{"title":666,"path":667,"stem":668},"The WTF Scale: IT Project Complexity","/blog/software-development/the-wtf-programming-scale-measuring-it-project-complexity","blog/software-development/the-wtf-programming-scale-measuring-it-project-complexity",{"title":670,"path":671,"stem":672},"Top 10 articles through the eyes of our developers","/blog/software-development/top-10-articles-through-the-eyes-of-our-developers","blog/software-development/top-10-articles-through-the-eyes-of-our-developers",{"title":674,"path":675,"stem":676},"Top 6 apps made with Flutter","/blog/software-development/top-6-apps-made-with-flutter","blog/software-development/top-6-apps-made-with-flutter",{"title":678,"path":679,"stem":680},"Uber 101: How Uber Made It to the Top","/blog/software-development/uber-101-how-this-ride-sharing-behemoth-made-it-to-the-top","blog/software-development/uber-101-how-this-ride-sharing-behemoth-made-it-to-the-top",{"title":682,"path":683,"stem":684},"MusicTech Lab Partners with Music Glue","/blog/software-development/unifying-artists-and-audiences-exploring-music-glue","blog/software-development/unifying-artists-and-audiences-exploring-music-glue",{"title":686,"path":687,"stem":688},"Why AI Will Defeat Traditional HR","/blog/software-development/warning-why-artificial-intelligence-will-defeat-traditional-hr","blog/software-development/warning-why-artificial-intelligence-will-defeat-traditional-hr",{"title":690,"path":691,"stem":692},"What is a Discovery Document?","/blog/software-development/what-is-discovery-document","blog/software-development/what-is-discovery-document",{"title":694,"path":695,"stem":696},"What is Flutter, and Why is it Worth Considering?","/blog/software-development/what-is-flutter-and-why-is-it-worth-considering","blog/software-development/what-is-flutter-and-why-is-it-worth-considering",{"title":698,"path":699,"stem":700},"What is a Watermarked Song?","/blog/software-development/what-is-watermarked-song","blog/software-development/what-is-watermarked-song",{"title":702,"path":703,"stem":704},"Choosing a Frontend Framework for the Web","/blog/software-development/which-framework-should-you-choose-for-the-frontend-web-platform-development","blog/software-development/which-framework-should-you-choose-for-the-frontend-web-platform-development",{"title":706,"path":707,"stem":708},"Why DAWs Are the Wrong Tool for Starting a Song","/blog/software-development/why-daws-wrong-tool-for-starting-song","blog/software-development/why-daws-wrong-tool-for-starting-song",{"title":710,"path":711,"stem":712},"Why the Programming World Loves Python","/blog/software-development/why-the-programming-world-loves-python","blog/software-development/why-the-programming-world-loves-python",{"title":714,"path":715,"stem":716},"Why We Don't Build Chat From Scratch (And Neither Should You)","/blog/software-development/why-we-dont-build-chat-from-scratch","blog/software-development/why-we-dont-build-chat-from-scratch",{"title":718,"path":719,"stem":720},"Why we use Sanity.io","/blog/software-development/why-we-use-sanity-io","blog/software-development/why-we-use-sanity-io",{"title":722,"path":723,"stem":724,"children":725,"page":69},"Sportstech","/blog/sportstech","blog/sportstech",[726,730],{"title":727,"path":728,"stem":729},"BeatBuddy Replay: Video Analysis App Challenges","/blog/sportstech/beatbuddy-replay-video-analysis-app-for-swimmers-flutter","blog/sportstech/beatbuddy-replay-video-analysis-app-for-swimmers-flutter",{"title":731,"path":732,"stem":733},"How to Create a Watch Face App for Garmin Watch","/blog/sportstech/how-to-create-watch-face-app-for-garmin-watch","blog/sportstech/how-to-create-watch-face-app-for-garmin-watch",{"id":735,"title":184,"authors":736,"badge":742,"body":744,"category":1427,"client":1428,"date":1429,"description":1430,"extension":1431,"faq":1432,"featured":69,"featuredOrder":1428,"hidden":69,"image":1448,"keyTakeaways":1450,"meta":1464,"navigation":926,"path":185,"seo":1465,"status":1428,"stem":186,"tags":1468,"teaser":1428,"__hash__":1477},"posts/blog/music-data/scout-isrc-metadata-enrichment-spotify-musicbrainz.md",[737],{"name":738,"to":739,"avatar":740},"Mariusz Smenzyk","https://www.linkedin.com/in/mariusz-smenzyk/",{"src":741},"/images/people/mariusz-smenzyk2.webp",{"label":5,"color":743},"#f59e0b",{"type":745,"value":746,"toc":1412},"minimark",[747,751,756,759,789,792,796,808,811,817,820,824,833,838,841,848,854,858,861,1110,1114,1118,1121,1165,1168,1172,1175,1179,1182,1188,1211,1217,1221,1224,1253,1262,1266,1269,1291,1294,1308,1318,1322,1325,1330,1333,1356,1360,1363,1395,1398,1408],[748,749,750],"p",{},"If you have ever opened a 40,000-row CSV and found half the ISRC codes missing, inconsistent, or flat-out wrong, you know the pain. Manually looking up each track via Spotify, MusicBrainz, or ISRC lookup tools takes days. We built Scout to do it in minutes.",[752,753,755],"h2",{"id":754},"the-problem-every-catalog-manager-knows","The Problem Every Catalog Manager Knows",[748,757,758],{},"Track data arrives as CSV or Excel files. They contain track names, artist names, and sometimes ISRCs. The problem is that \"sometimes\" is doing a lot of heavy lifting in that sentence.",[760,761,768,774,779,784],"div",{"className":762},[763,764,765,766,767],"grid","grid-cols-1","md:grid-cols-2","gap-4","my-8",[769,770],"spotlight-card",{"description":771,"icon":772,"title":773},"Tracks without ISRC codes can't be matched to rights holders, leading to unclaimed royalties.","i-lucide-file-warning","Missing ISRCs",[769,775],{"description":776,"icon":777,"title":778},"The same recording may have different ISRCs across distributors, DSPs, and catalog systems.","i-lucide-shuffle","Inconsistent ISRCs",[769,780],{"description":781,"icon":782,"title":783},"Multiple rows resolve to the same ISRC, inflating track counts and skewing analytics.","i-lucide-copy","Duplicate Entries",[769,785],{"description":786,"icon":787,"title":788},"Checking each track one-by-one against web tools or APIs takes 2+ days for a large catalog.","i-lucide-clock","Manual Lookup",[748,790,791],{},"This is not a niche issue. Anyone doing soundtrack acquisition, catalog evaluation, royalty reconciliation, or building investor decks hits this wall. The data exists across multiple sources, but nobody connects it at scale.",[752,793,795],{"id":794},"a-real-world-example-santanas-smooth","A Real-World Example: Santana's \"Smooth\"",[748,797,798,799,803,804,807],{},"To show why this matters, take a concrete case. Santana's \"Smooth\" appears in a royalty report with ISRC ",[800,801,802],"code",{},"USAT29900471",". When Scout looks up the same track on Spotify, it comes back as ",[800,805,806],{},"USAR19900033",".",[748,809,810],{},"Both are valid ISRCs for the same recording. The first is from the original 1999 Arista release, the second from a later digital distribution. This happens constantly in the music industry because every release edition (original, remaster, compilation, deluxe, single) can get its own ISRC.",[812,813,814],"note",{},[748,815,816],{},"ISRC mismatches between sources do not mean the data is wrong. They mean the same recording exists in multiple editions. Scout flags these for review rather than treating them as errors.",[748,818,819],{},"Without automated enrichment, you would either miss this mismatch entirely or spend hours tracking it down manually. Multiply that by 40,000 rows and you understand why catalog managers describe this work as \"soul-crushing.\"",[752,821,823],{"id":822},"what-scout-does","What Scout Does",[748,825,826,827,832],{},"Scout is a feature inside ",[828,829,831],"a",{"href":830},"/services/musicdata-lab","MusicData Lab"," that batch-enriches track metadata from two authoritative sources: the Spotify API and the MusicBrainz API.",[834,835,837],"h3",{"id":836},"upload-and-map","Upload and Map",[748,839,840],{},"Drop a CSV or Excel file. Scout auto-detects common column names (track, artist, ISRC, URL) and lets you adjust the mapping before processing.",[748,842,843],{},[844,845],"img",{"alt":846,"src":847},"Scout upload page","/images/blog/musictechlab_blog_scout-upload.webp",[748,849,850],{},[844,851],{"alt":852,"src":853},"Scout column mapping with auto-detected fields and CSV preview","/images/blog/musictechlab_blog_scout-mapping.webp",[834,855,857],{"id":856},"enrich-every-track","Enrich Every Track",[748,859,860],{},"For each row, Scout runs a four-stage lookup pipeline:",[862,863,868],"pre",{"className":864,"code":865,"language":866,"meta":867,"style":867},"language-mermaid shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","flowchart TD\n    A[CSV Row] --> B{Has URL?}\n    B -->|Yes| C[Spotify: lookup by URL]\n    B -->|No| D[Spotify: search by track + artist]\n    C --> E{Spotify match?}\n    D --> E\n    E -->|Yes| F[Track, artist, album, ISRC, release date, popularity]\n    E -->|No| G[No Spotify data]\n\n    F --> H{Has ISRC?}\n    G --> H\n    H -->|Yes| I[MusicBrainz: lookup by ISRC]\n    H -->|No| J[MusicBrainz: search by recording + artist]\n    I --> K{MB match?}\n    J --> K\n    K -->|Yes| L[Artist, release, ISRC, label, country]\n    K -->|No| M[No MusicBrainz data]\n\n    L --> N[ISRC Resolution]\n    M --> N\n    N --> O[Pick best ISRC from Spotify / MB / input]\n\n    O --> P[Flagging]\n    P --> Q{ISRCs disagree?}\n    Q -->|Yes| R[isrc_mismatch]\n    Q -->|No| S{Artist names differ?}\n    R --> S\n    S -->|Yes| T[artist_mismatch]\n    S -->|No| U[Confidence Score]\n    T --> U\n\n    U --> V[Spotify +0.50 / MB +0.30 / ISRC +0.20]\n\n    style A fill:#f8fafc,stroke:#94a3b8,color:#000\n    style F fill:#d1fae5,stroke:#10b981,color:#000\n    style L fill:#dbeafe,stroke:#3b82f6,color:#000\n    style O fill:#fef3c7,stroke:#f59e0b,color:#000\n    style R fill:#fee2e2,stroke:#ef4444,color:#000\n    style T fill:#fee2e2,stroke:#ef4444,color:#000\n    style V fill:#d1fae5,stroke:#10b981,color:#000\n","mermaid","",[800,869,870,879,885,891,897,903,909,915,921,928,934,940,946,952,958,964,970,976,981,987,993,999,1004,1010,1016,1022,1028,1034,1040,1046,1052,1057,1063,1068,1074,1080,1086,1092,1098,1104],{"__ignoreMap":867},[871,872,875],"span",{"class":873,"line":874},"line",1,[871,876,878],{"class":877},"sTEyZ","flowchart TD\n",[871,880,882],{"class":873,"line":881},2,[871,883,884],{"class":877},"    A[CSV Row] --> B{Has URL?}\n",[871,886,888],{"class":873,"line":887},3,[871,889,890],{"class":877},"    B -->|Yes| C[Spotify: lookup by URL]\n",[871,892,894],{"class":873,"line":893},4,[871,895,896],{"class":877},"    B -->|No| D[Spotify: search by track + artist]\n",[871,898,900],{"class":873,"line":899},5,[871,901,902],{"class":877},"    C --> E{Spotify match?}\n",[871,904,906],{"class":873,"line":905},6,[871,907,908],{"class":877},"    D --> E\n",[871,910,912],{"class":873,"line":911},7,[871,913,914],{"class":877},"    E -->|Yes| F[Track, artist, album, ISRC, release date, popularity]\n",[871,916,918],{"class":873,"line":917},8,[871,919,920],{"class":877},"    E -->|No| G[No Spotify data]\n",[871,922,924],{"class":873,"line":923},9,[871,925,927],{"emptyLinePlaceholder":926},true,"\n",[871,929,931],{"class":873,"line":930},10,[871,932,933],{"class":877},"    F --> H{Has ISRC?}\n",[871,935,937],{"class":873,"line":936},11,[871,938,939],{"class":877},"    G --> H\n",[871,941,943],{"class":873,"line":942},12,[871,944,945],{"class":877},"    H -->|Yes| I[MusicBrainz: lookup by ISRC]\n",[871,947,949],{"class":873,"line":948},13,[871,950,951],{"class":877},"    H -->|No| J[MusicBrainz: search by recording + artist]\n",[871,953,955],{"class":873,"line":954},14,[871,956,957],{"class":877},"    I --> K{MB match?}\n",[871,959,961],{"class":873,"line":960},15,[871,962,963],{"class":877},"    J --> K\n",[871,965,967],{"class":873,"line":966},16,[871,968,969],{"class":877},"    K -->|Yes| L[Artist, release, ISRC, label, country]\n",[871,971,973],{"class":873,"line":972},17,[871,974,975],{"class":877},"    K -->|No| M[No MusicBrainz data]\n",[871,977,979],{"class":873,"line":978},18,[871,980,927],{"emptyLinePlaceholder":926},[871,982,984],{"class":873,"line":983},19,[871,985,986],{"class":877},"    L --> N[ISRC Resolution]\n",[871,988,990],{"class":873,"line":989},20,[871,991,992],{"class":877},"    M --> N\n",[871,994,996],{"class":873,"line":995},21,[871,997,998],{"class":877},"    N --> O[Pick best ISRC from Spotify / MB / input]\n",[871,1000,1002],{"class":873,"line":1001},22,[871,1003,927],{"emptyLinePlaceholder":926},[871,1005,1007],{"class":873,"line":1006},23,[871,1008,1009],{"class":877},"    O --> P[Flagging]\n",[871,1011,1013],{"class":873,"line":1012},24,[871,1014,1015],{"class":877},"    P --> Q{ISRCs disagree?}\n",[871,1017,1019],{"class":873,"line":1018},25,[871,1020,1021],{"class":877},"    Q -->|Yes| R[isrc_mismatch]\n",[871,1023,1025],{"class":873,"line":1024},26,[871,1026,1027],{"class":877},"    Q -->|No| S{Artist names differ?}\n",[871,1029,1031],{"class":873,"line":1030},27,[871,1032,1033],{"class":877},"    R --> S\n",[871,1035,1037],{"class":873,"line":1036},28,[871,1038,1039],{"class":877},"    S -->|Yes| T[artist_mismatch]\n",[871,1041,1043],{"class":873,"line":1042},29,[871,1044,1045],{"class":877},"    S -->|No| U[Confidence Score]\n",[871,1047,1049],{"class":873,"line":1048},30,[871,1050,1051],{"class":877},"    T --> U\n",[871,1053,1055],{"class":873,"line":1054},31,[871,1056,927],{"emptyLinePlaceholder":926},[871,1058,1060],{"class":873,"line":1059},32,[871,1061,1062],{"class":877},"    U --> V[Spotify +0.50 / MB +0.30 / ISRC +0.20]\n",[871,1064,1066],{"class":873,"line":1065},33,[871,1067,927],{"emptyLinePlaceholder":926},[871,1069,1071],{"class":873,"line":1070},34,[871,1072,1073],{"class":877},"    style A fill:#f8fafc,stroke:#94a3b8,color:#000\n",[871,1075,1077],{"class":873,"line":1076},35,[871,1078,1079],{"class":877},"    style F fill:#d1fae5,stroke:#10b981,color:#000\n",[871,1081,1083],{"class":873,"line":1082},36,[871,1084,1085],{"class":877},"    style L fill:#dbeafe,stroke:#3b82f6,color:#000\n",[871,1087,1089],{"class":873,"line":1088},37,[871,1090,1091],{"class":877},"    style O fill:#fef3c7,stroke:#f59e0b,color:#000\n",[871,1093,1095],{"class":873,"line":1094},38,[871,1096,1097],{"class":877},"    style R fill:#fee2e2,stroke:#ef4444,color:#000\n",[871,1099,1101],{"class":873,"line":1100},39,[871,1102,1103],{"class":877},"    style T fill:#fee2e2,stroke:#ef4444,color:#000\n",[871,1105,1107],{"class":873,"line":1106},40,[871,1108,1109],{"class":877},"    style V fill:#d1fae5,stroke:#10b981,color:#000\n",[1111,1112],"project-timeline",{":items":1113},"[{\"title\":\"Spotify Lookup\",\"description\":\"Searches by track URL (if present), then by track name + artist name. Returns track name, artist, album, ISRC, release date, popularity, and a direct Spotify link.\",\"icon\":\"i-lucide-disc-3\"},{\"title\":\"MusicBrainz Lookup\",\"description\":\"Searches by ISRC first (using the Spotify ISRC or input ISRC), then falls back to recording name + artist. Returns artist, release, ISRC, label, and country.\",\"icon\":\"i-lucide-database\"},{\"title\":\"ISRC Resolution\",\"description\":\"Picks the best ISRC from all available sources (Spotify, MusicBrainz, input) and assigns it as the resolved identifier for the track.\",\"icon\":\"i-lucide-git-merge\"},{\"title\":\"Flagging\",\"description\":\"Detects ISRC mismatches between sources, artist name mismatches (using fuzzy matching), and duplicate ISRCs across rows.\",\"icon\":\"i-lucide-flag\"}]",[834,1115,1117],{"id":1116},"confidence-scoring","Confidence Scoring",[748,1119,1120],{},"Each track gets a confidence score from 0.00 to 1.00:",[1122,1123,1124,1137],"table",{},[1125,1126,1127],"thead",{},[1128,1129,1130,1134],"tr",{},[1131,1132,1133],"th",{},"Source",[1131,1135,1136],{},"Score",[1138,1139,1140,1149,1157],"tbody",{},[1128,1141,1142,1146],{},[1143,1144,1145],"td",{},"Spotify match",[1143,1147,1148],{},"+0.50",[1128,1150,1151,1154],{},[1143,1152,1153],{},"MusicBrainz match",[1143,1155,1156],{},"+0.30",[1128,1158,1159,1162],{},[1143,1160,1161],{},"Resolved ISRC",[1143,1163,1164],{},"+0.20",[748,1166,1167],{},"A track matched by both Spotify and MusicBrainz with a resolved ISRC scores a perfect 1.00. Flags are informational only. They tell you something needs attention without penalizing the match quality.",[834,1169,1171],{"id":1170},"export","Export",[748,1173,1174],{},"When processing completes, download a clean CSV with all original data plus every enriched field: Spotify metadata, MusicBrainz metadata, resolved ISRCs, status, flags, and confidence scores. Ready for analysis, investor decks, or import into your rights management system.",[752,1176,1178],{"id":1177},"processing-at-scale","Processing at Scale",[748,1180,1181],{},"Scout processes files asynchronously using Celery workers. A 40,000-row file runs in the background while you continue working. The job detail page shows real-time progress without page refreshes:",[748,1183,1184],{},[844,1185],{"alt":1186,"src":1187},"Live streaming logs during enrichment","/images/blog/musictechlab_blog_scout-logs.webp",[760,1189,1191,1196,1201,1206],{"className":1190},[763,764,765,766,767],[769,1192],{"description":1193,"icon":1194,"title":1195},"Progress bar, track counts, and status badges update via AJAX polling every 3 seconds.","i-lucide-activity","Live Progress",[769,1197],{"description":1198,"icon":1199,"title":1200},"Watch Spotify and MusicBrainz lookups happen in real time in the Logs tab.","i-lucide-scroll-text","Streaming Logs",[769,1202],{"description":1203,"icon":1204,"title":1205},"Search and filter results by track, artist, ISRC, status, confidence range, or flags.","i-lucide-filter","Column Filters",[769,1207],{"description":1208,"icon":1209,"title":1210},"Download enriched data as a clean, grouped CSV when processing completes.","i-lucide-file-down","CSV Export",[748,1212,1213],{},[844,1214],{"alt":1215,"src":1216},"Completed job with enriched tracks, confidence scores, and flags","/images/blog/musictechlab_blog_scout-results.webp",[752,1218,1220],{"id":1219},"the-flags-that-matter","The Flags That Matter",[748,1222,1223],{},"Scout raises four types of flags:",[1225,1226,1227,1235,1241,1247],"ul",{},[1228,1229,1230,1234],"li",{},[1231,1232,1233],"strong",{},"isrc_mismatch"," - the input ISRC, Spotify ISRC, and MusicBrainz ISRC do not all agree. Most common flag. Usually means different release editions.",[1228,1236,1237,1240],{},[1231,1238,1239],{},"artist_mismatch"," - the artist name from Spotify and MusicBrainz has a fuzzy match score below 75%. Can indicate featuring artists, name variations, or genuine data issues.",[1228,1242,1243,1246],{},[1231,1244,1245],{},"duplicate_isrc"," - multiple rows in your file resolve to the same ISRC. Important for catching double-counted tracks.",[1228,1248,1249,1252],{},[1231,1250,1251],{},"enrichment_error"," - the lookup failed for technical reasons (API timeout, rate limit, etc.).",[1254,1255,1256],"tip",{},[748,1257,1258,1259,1261],{},"Filter by ",[800,1260,1233],{}," to quickly review all tracks where your input ISRC differs from what Spotify and MusicBrainz report. These are your highest-priority reconciliation items.",[752,1263,1265],{"id":1264},"why-public-apis-instead-of-dsp-bulk-feeds","Why Public APIs Instead of DSP Bulk Feeds?",[748,1267,1268],{},"A reasonable question if you know the space: why use the public Spotify Web API and MusicBrainz, rather than a licensed DSP bulk feed?",[748,1270,1271,1272,1278,1279,1284,1285,1290],{},"The most well-known bulk feed is Apple's ",[828,1273,1277],{"href":1274,"rel":1275},"https://performance-partners.apple.com/epf",[1276],"nofollow","Enterprise Partner Feed (EPF)"," — daily metadata dumps of the full Apple Music catalog, delivered to approved partners (distributors, royalty processors, rights administrators). On the Spotify side, partner programs like ",[828,1280,1283],{"href":1281,"rel":1282},"https://www.synchtank.com/blog/better-data-than-never-publishers-finally-get-under-the-spotify-bonnet/",[1276],"Spotify Publishing Analytics"," give publishers and licensees access to stream, ISRC, and playlist data that the public ",[828,1286,1289],{"href":1287,"rel":1288},"https://developer.spotify.com/documentation/web-api",[1276],"Web API"," does not expose.",[748,1292,1293],{},"Scout uses the public APIs for two reasons:",[1225,1295,1296,1302],{},[1228,1297,1298,1301],{},[1231,1299,1300],{},"Bulk feeds require a signed partner agreement."," Approval is gated to entities with a real B2B use case in distribution, publishing, or rights administration. Most catalog buyers and acquisition teams we work with do not hold one.",[1228,1303,1304,1307],{},[1231,1305,1306],{},"For evaluation work, public APIs hit the same accuracy ceiling on ISRCs and core metadata."," Bulk feeds win on scale and historical snapshots; for a one-off enrichment pass, the cross-check between Spotify and MusicBrainz already catches the issues that matter.",[812,1309,1310],{},[748,1311,1312,1313,1317],{},"If you do have access to a DSP partner feed and want Scout to ingest it instead of (or alongside) the Web API, ",[828,1314,1316],{"href":1315},"/contact","get in touch",". The pipeline is source-agnostic — adding a feed is a configuration change, not a rewrite.",[752,1319,1321],{"id":1320},"from-script-to-product","From Script to Product",[748,1323,1324],{},"The inspiration for Scout came from a real conversation with a music professional doing soundtrack acquisition work. They had built a Python script that batch-processed metadata from Spotify and MusicBrainz APIs using pandas. No AI needed, just API calls and data wrangling.",[1254,1326,1327],{},[748,1328,1329],{},"It cut a 2-day manual task down to 30 minutes.",[748,1331,1332],{},"We took that exact workflow and productized it inside MusicData Lab:",[760,1334,1336,1341,1346,1351],{"className":1335},[763,764,765,766,767],[769,1337],{"description":1338,"icon":1339,"title":1340},"Upload a file, map columns, click run.","i-lucide-mouse-pointer-click","No Coding Required",[769,1342],{"description":1343,"icon":1344,"title":1345},"Works with any CSV or Excel file, auto-detects common column layouts.","i-lucide-file-spreadsheet","Any File Format",[769,1347],{"description":1348,"icon":1349,"title":1350},"Jobs, tracks, and logs are stored in the database. Come back to any job weeks later.","i-lucide-hard-drive","Persistent Results",[769,1352],{"description":1353,"icon":1354,"title":1355},"Background processing with live progress, not a script that blocks your terminal.","i-lucide-layers","Built for Large Catalogs",[752,1357,1359],{"id":1358},"who-this-is-for","Who This Is For",[748,1361,1362],{},"Scout is built for anyone who deals with music metadata at scale:",[1225,1364,1365,1371,1377,1383,1389],{},[1228,1366,1367,1370],{},[1231,1368,1369],{},"Rights managers"," reconciling royalty statements across distributors",[1228,1372,1373,1376],{},[1231,1374,1375],{},"A&R teams"," evaluating catalogs for acquisition",[1228,1378,1379,1382],{},[1231,1380,1381],{},"Independent labels"," cleaning up their metadata before pitching to sync agents",[1228,1384,1385,1388],{},[1231,1386,1387],{},"Royalty analysts"," spotting unclaimed revenue from ISRC gaps",[1228,1390,1391,1394],{},[1231,1392,1393],{},"Catalog managers"," preparing clean data for investor decks or audits",[748,1396,1397],{},"If you are spending days in spreadsheets manually looking up ISRCs, Scout does that work for you and flags the problems worth your attention.",[812,1399,1400],{},[748,1401,1402,1403,1405,1406,807],{},"Scout is part of ",[828,1404,831],{"href":830},", our music distribution analytics platform. If you are dealing with messy catalog data and want to see Scout in action, ",[828,1407,1316],{"href":1315},[1409,1410,1411],"style",{},"html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":867,"searchDepth":881,"depth":881,"links":1413},[1414,1415,1416,1422,1423,1424,1425,1426],{"id":754,"depth":881,"text":755},{"id":794,"depth":881,"text":795},{"id":822,"depth":881,"text":823,"children":1417},[1418,1419,1420,1421],{"id":836,"depth":887,"text":837},{"id":856,"depth":887,"text":857},{"id":1116,"depth":887,"text":1117},{"id":1170,"depth":887,"text":1171},{"id":1177,"depth":881,"text":1178},{"id":1219,"depth":881,"text":1220},{"id":1264,"depth":881,"text":1265},{"id":1320,"depth":881,"text":1321},{"id":1358,"depth":881,"text":1359},"music-data",null,"2026-04-04T00:00:00.000Z","How we built Scout to batch-enrich music metadata via Spotify and MusicBrainz APIs, flag ISRC mismatches, and export clean CSVs for catalog evaluation and royalty reconciliation.","md",[1433,1436,1439,1442,1445],{"question":1434,"answer":1435},"What is Scout in MusicData Lab?","Scout is a batch metadata enrichment tool that takes CSV or Excel files with track data and enriches every row with ISRCs, artist names, album info, and release dates from Spotify and MusicBrainz APIs.",{"question":1437,"answer":1438},"Why do the same tracks have different ISRCs?","Multiple ISRCs can exist for the same recording because each release edition (original, remaster, compilation, deluxe) gets its own ISRC. This is the most common source of metadata inconsistency in royalty reports.",{"question":1440,"answer":1441},"What file formats does Scout support?","Scout works with any CSV or Excel file. It auto-detects column mappings for common distributor and DSP report formats.",{"question":1443,"answer":1444},"How does the confidence score work?","Scout scores each track on a 0.00 to 1.00 scale: Spotify match adds +0.50, MusicBrainz match adds +0.30, and a resolved ISRC adds +0.20. Flags like ISRC mismatch or artist mismatch are informational and do not reduce the score.",{"question":1446,"answer":1447},"Why doesn't Scout use a DSP bulk feed like Apple's EPF or Spotify partner data?","Bulk DSP feeds (Apple's Enterprise Partner Feed, Spotify Publishing Analytics, distributor-only APIs) require a signed partner agreement that most catalog buyers do not hold. Scout uses the public Spotify Web API and MusicBrainz, which deliver the same accuracy for ISRCs and core metadata in evaluation workflows. For teams with bulk-feed access, Scout's pipeline is source-agnostic and can be pointed at a partner feed.",{"src":1449},"/images/blog/musictechlab_blog_scout-isrc-metadata-enrichment.webp",{"enabled":926,"items":1451},[1452,1455,1458,1461],{"text":1453,"icon":1454},"Scout batch-enriches 40,000+ tracks from Spotify and MusicBrainz APIs in minutes, not days.","i-lucide-zap",{"text":1456,"icon":1457},"Confidence scores range from 0.00 to 1.00: Spotify +0.50, MusicBrainz +0.30, resolved ISRC +0.20.","i-lucide-bar-chart-3",{"text":1459,"icon":1460},"ISRC mismatches between sources usually mean different release editions, not data errors.","i-lucide-alert-triangle",{"text":1462,"icon":1463},"Exports a clean CSV with all enriched fields ready for rights management or investor decks.","i-lucide-file-text",{},{"title":1466,"description":1467},"Scout: Batch ISRC Metadata Enrichment via Spotify & MusicBrainz | MusicTech Lab","Enrich 40k+ tracks with ISRCs, artist data, and album info from Spotify and MusicBrainz. Flag mismatches, resolve duplicates, export clean CSVs.",[1469,1470,1471,1472,1473,1474,1475,1476],"ISRC","metadata","Spotify API","MusicBrainz","DSP data","catalog management","royalty reconciliation","music-tech","HYHj6ILj_Hn8N09PjGf4BIXND0khSkpvaUubGqjiusg",[1479,1481],{"title":180,"path":181,"stem":182,"description":1480,"children":-1},"Poland’s first Creative Tech report is here and MusicTech Lab’s Maciej Dulski shares insights on how music innovation in Poland is gaining momentum.",{"title":188,"path":189,"stem":190,"description":1482,"children":-1},"How self-publishing evolved in the music industry, shifting control from record labels to independent artists, and how Emuze.me empowers creators today.",[1484,2565,2587,3787],{"id":1485,"title":172,"authors":1486,"badge":1489,"body":1492,"category":1427,"client":1428,"date":2527,"description":2528,"extension":1431,"faq":2529,"featured":69,"featuredOrder":1428,"hidden":69,"image":2542,"keyTakeaways":2544,"meta":2556,"navigation":926,"path":173,"seo":2557,"status":1428,"stem":174,"tags":2560,"teaser":1428,"__hash__":2564,"score":899},"posts/blog/music-data/mtl-metadata-mcp-open-source-audio-metadata-embedding.md",[1487],{"name":738,"to":739,"avatar":1488},{"src":741},{"label":1490,"color":1491},"Open Source","#7c3aed",{"type":745,"value":1493,"toc":2509},[1494,1501,1515,1519,1522,1545,1548,1552,1555,1578,1582,1663,1667,1670,1674,1677,1685,1688,1897,1900,1906,1910,1913,1919,1922,1928,1932,1935,1941,2248,2254,2257,2263,2267,2270,2276,2282,2288,2294,2300,2306,2312,2317,2321,2340,2343,2347,2351,2386,2390,2431,2434,2447,2451,2454,2476,2485,2488,2491,2498,2503,2506],[748,1495,1496,1497,1500],{},"Every music file carries invisible data: the artist name, album, genre, release year, and the ISRC code that ties a recording to its rights holder. When this metadata is missing or incorrect, royalties get lost, catalog searches fail, and distributors reject deliveries. We built ",[1231,1498,1499],{},"mtl-metadata-mcp"," to solve this problem directly from the command line, using natural language.",[812,1502,1503],{},[748,1504,1505,1508,1509,1514],{},[1231,1506,1507],{},"What is MCP?"," The ",[828,1510,1513],{"href":1511,"rel":1512},"https://modelcontextprotocol.io/",[1276],"Model Context Protocol"," (MCP) is an open standard that lets AI assistants like Claude connect to external tools. Instead of copying and pasting data between apps, you describe what you want in plain English and the AI calls the right tool automatically. MCP servers are lightweight programs that expose specific capabilities - reading files, querying APIs, or in our case, manipulating audio metadata.",[752,1516,1518],{"id":1517},"why-we-built-this","Why We Built This",[748,1520,1521],{},"At MusicTech Lab, we sometimes need to quickly verify or fix metadata in audio files - checking ISRC codes, correcting artist names, or spotting missing tags before a delivery. It is not our daily job, but when it comes up, we wanted a tool that lets us do it fast without leaving the terminal:",[760,1523,1525,1530,1535,1540],{"className":1524},[763,764,765,766,767],[769,1526],{"description":1527,"icon":1528,"title":1529},"Read metadata from any audio file and present it clearly.","i-lucide-book-open","Read metadata",[769,1531],{"description":1532,"icon":1533,"title":1534},"Write metadata using natural language commands.","i-lucide-pen-line","Write metadata",[769,1536],{"description":1537,"icon":1538,"title":1539},"Scan entire directories to find files with missing or incomplete tags.","i-lucide-scan-search","Scan directories",[769,1541],{"description":1542,"icon":1543,"title":1544},"Work inside our development workflow without switching contexts.","i-lucide-workflow","Stay in flow",[748,1546,1547],{},"Since we already use Claude Code for development, building an MCP server was the natural choice.",[752,1549,1551],{"id":1550},"the-tools","The Tools",[748,1553,1554],{},"mtl-metadata-mcp exposes four tools:",[760,1556,1558,1563,1568,1573],{"className":1557},[763,764,765,766,767],[769,1559],{"description":1560,"icon":1561,"title":1562},"Read current metadata tags and file info (format, duration, bitrate, sample rate, channels) from an audio file.","i-lucide-file-search","metadata_read",[769,1564],{"description":1565,"icon":1566,"title":1567},"Embed or update title, artist, album, date, genre, and ISRC. Only the fields you specify are changed.","i-lucide-file-pen","metadata_write",[769,1569],{"description":1570,"icon":1571,"title":1572},"Strip all metadata tags from a file. Audio data is preserved.","i-lucide-eraser","metadata_clear",[769,1574],{"description":1575,"icon":1576,"title":1577},"Scan a directory for audio files and report which metadata fields are present or missing.","i-lucide-folder-search","metadata_scan",[752,1579,1581],{"id":1580},"supported-fields","Supported Fields",[1122,1583,1584,1597],{},[1125,1585,1586],{},[1128,1587,1588,1591,1594],{},[1131,1589,1590],{},"Field",[1131,1592,1593],{},"Description",[1131,1595,1596],{},"Example",[1138,1598,1599,1610,1621,1631,1642,1653],{},[1128,1600,1601,1604,1607],{},[1143,1602,1603],{},"Title",[1143,1605,1606],{},"Track name",[1143,1608,1609],{},"\"Back in Black\"",[1128,1611,1612,1615,1618],{},[1143,1613,1614],{},"Artist",[1143,1616,1617],{},"Performer",[1143,1619,1620],{},"\"AC/DC\"",[1128,1622,1623,1626,1629],{},[1143,1624,1625],{},"Album",[1143,1627,1628],{},"Album name",[1143,1630,1609],{},[1128,1632,1633,1636,1639],{},[1143,1634,1635],{},"Date",[1143,1637,1638],{},"Release year",[1143,1640,1641],{},"\"1980\"",[1128,1643,1644,1647,1650],{},[1143,1645,1646],{},"Genre",[1143,1648,1649],{},"Music genre",[1143,1651,1652],{},"\"Classic Rock\"",[1128,1654,1655,1657,1660],{},[1143,1656,1469],{},[1143,1658,1659],{},"International Standard Recording Code",[1143,1661,1662],{},"\"AUAP07900028\"",[752,1664,1666],{"id":1665},"how-it-works-in-practice","How It Works in Practice",[748,1668,1669],{},"Once installed, you just talk to Claude Code. No commands to memorize, no flags to look up.",[834,1671,1673],{"id":1672},"reading-metadata","Reading metadata",[748,1675,1676],{},"Ask Claude to read a file:",[862,1678,1683],{"className":1679,"code":1681,"language":1682,"meta":867},[1680],"language-text","> What metadata does back-in-black.mp3 have?\n","text",[800,1684,1681],{"__ignoreMap":867},[748,1686,1687],{},"The response comes back as structured data:",[862,1689,1693],{"className":1690,"code":1691,"language":1692,"meta":867,"style":867},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"file\": \"/Users/you/Music/back-in-black.mp3\",\n  \"format\": \"mp3\",\n  \"duration_seconds\": 254.38,\n  \"bitrate_kbps\": 128,\n  \"sample_rate_hz\": 44100,\n  \"channels\": 2,\n  \"metadata\": {\n    \"title\": \"Back in Black\",\n    \"artist\": \"ACDC\",\n    \"genre\": \"Classic Rock\"\n  }\n}\n","json",[800,1694,1695,1701,1728,1748,1765,1781,1797,1813,1826,1848,1868,1887,1892],{"__ignoreMap":867},[871,1696,1697],{"class":873,"line":874},[871,1698,1700],{"class":1699},"sMK4o","{\n",[871,1702,1703,1706,1710,1713,1716,1719,1723,1725],{"class":873,"line":881},[871,1704,1705],{"class":1699},"  \"",[871,1707,1709],{"class":1708},"spNyl","file",[871,1711,1712],{"class":1699},"\"",[871,1714,1715],{"class":1699},":",[871,1717,1718],{"class":1699}," \"",[871,1720,1722],{"class":1721},"sfazB","/Users/you/Music/back-in-black.mp3",[871,1724,1712],{"class":1699},[871,1726,1727],{"class":1699},",\n",[871,1729,1730,1732,1735,1737,1739,1741,1744,1746],{"class":873,"line":887},[871,1731,1705],{"class":1699},[871,1733,1734],{"class":1708},"format",[871,1736,1712],{"class":1699},[871,1738,1715],{"class":1699},[871,1740,1718],{"class":1699},[871,1742,1743],{"class":1721},"mp3",[871,1745,1712],{"class":1699},[871,1747,1727],{"class":1699},[871,1749,1750,1752,1755,1757,1759,1763],{"class":873,"line":893},[871,1751,1705],{"class":1699},[871,1753,1754],{"class":1708},"duration_seconds",[871,1756,1712],{"class":1699},[871,1758,1715],{"class":1699},[871,1760,1762],{"class":1761},"sbssI"," 254.38",[871,1764,1727],{"class":1699},[871,1766,1767,1769,1772,1774,1776,1779],{"class":873,"line":899},[871,1768,1705],{"class":1699},[871,1770,1771],{"class":1708},"bitrate_kbps",[871,1773,1712],{"class":1699},[871,1775,1715],{"class":1699},[871,1777,1778],{"class":1761}," 128",[871,1780,1727],{"class":1699},[871,1782,1783,1785,1788,1790,1792,1795],{"class":873,"line":905},[871,1784,1705],{"class":1699},[871,1786,1787],{"class":1708},"sample_rate_hz",[871,1789,1712],{"class":1699},[871,1791,1715],{"class":1699},[871,1793,1794],{"class":1761}," 44100",[871,1796,1727],{"class":1699},[871,1798,1799,1801,1804,1806,1808,1811],{"class":873,"line":911},[871,1800,1705],{"class":1699},[871,1802,1803],{"class":1708},"channels",[871,1805,1712],{"class":1699},[871,1807,1715],{"class":1699},[871,1809,1810],{"class":1761}," 2",[871,1812,1727],{"class":1699},[871,1814,1815,1817,1819,1821,1823],{"class":873,"line":917},[871,1816,1705],{"class":1699},[871,1818,1470],{"class":1708},[871,1820,1712],{"class":1699},[871,1822,1715],{"class":1699},[871,1824,1825],{"class":1699}," {\n",[871,1827,1828,1831,1835,1837,1839,1841,1844,1846],{"class":873,"line":923},[871,1829,1830],{"class":1699},"    \"",[871,1832,1834],{"class":1833},"sBMFI","title",[871,1836,1712],{"class":1699},[871,1838,1715],{"class":1699},[871,1840,1718],{"class":1699},[871,1842,1843],{"class":1721},"Back in Black",[871,1845,1712],{"class":1699},[871,1847,1727],{"class":1699},[871,1849,1850,1852,1855,1857,1859,1861,1864,1866],{"class":873,"line":930},[871,1851,1830],{"class":1699},[871,1853,1854],{"class":1833},"artist",[871,1856,1712],{"class":1699},[871,1858,1715],{"class":1699},[871,1860,1718],{"class":1699},[871,1862,1863],{"class":1721},"ACDC",[871,1865,1712],{"class":1699},[871,1867,1727],{"class":1699},[871,1869,1870,1872,1875,1877,1879,1881,1884],{"class":873,"line":936},[871,1871,1830],{"class":1699},[871,1873,1874],{"class":1833},"genre",[871,1876,1712],{"class":1699},[871,1878,1715],{"class":1699},[871,1880,1718],{"class":1699},[871,1882,1883],{"class":1721},"Classic Rock",[871,1885,1886],{"class":1699},"\"\n",[871,1888,1889],{"class":873,"line":942},[871,1890,1891],{"class":1699},"  }\n",[871,1893,1894],{"class":873,"line":948},[871,1895,1896],{"class":1699},"}\n",[748,1898,1899],{},"Claude then formats this into a readable table and points out missing fields - in this case, album, date, and ISRC.",[748,1901,1902],{},[844,1903],{"alt":1904,"src":1905},"Reading metadata from back-in-black.mp3 in Claude Code","/images/blog/musictechlab_blog_mtl-metadata-mcp-read.webp",[834,1907,1909],{"id":1908},"writing-metadata","Writing metadata",[748,1911,1912],{},"Tell Claude what to fill in:",[862,1914,1917],{"className":1915,"code":1916,"language":1682,"meta":867},[1680],"> Set the album to \"Back in Black\", date to 1980, and ISRC to AUAP07900028\n",[800,1918,1916],{"__ignoreMap":867},[748,1920,1921],{},"Only the specified fields are updated. Everything else stays untouched.",[748,1923,1924],{},[844,1925],{"alt":1926,"src":1927},"Writing metadata in Claude Code","/images/blog/musictechlab_blog_mtl-metadata-mcp-write.webp",[834,1929,1931],{"id":1930},"scanning-a-library","Scanning a library",[748,1933,1934],{},"This is where it gets powerful:",[862,1936,1939],{"className":1937,"code":1938,"language":1682,"meta":867},[1680],"> Scan ~/Music/demos and tell me which tracks are missing ISRC codes\n",[800,1940,1938],{"__ignoreMap":867},[862,1942,1944],{"className":1690,"code":1943,"language":1692,"meta":867,"style":867},"{\n  \"directory\": \"/Users/you/Music/demos\",\n  \"total_files\": 3,\n  \"files\": [\n    {\n      \"file\": \"idea-01.mp3\",\n      \"has_metadata\": true,\n      \"fields_present\": [\"title\", \"artist\"],\n      \"fields_missing\": [\"album\", \"date\", \"genre\", \"isrc\"]\n    },\n    {\n      \"file\": \"sketch.flac\",\n      \"has_metadata\": false,\n      \"fields_present\": [],\n      \"fields_missing\": [\"title\", \"artist\", \"album\", \"date\", \"genre\", \"isrc\"]\n    }\n  ]\n}\n",[800,1945,1946,1950,1970,1986,2000,2005,2025,2039,2071,2120,2125,2129,2148,2161,2174,2234,2239,2244],{"__ignoreMap":867},[871,1947,1948],{"class":873,"line":874},[871,1949,1700],{"class":1699},[871,1951,1952,1954,1957,1959,1961,1963,1966,1968],{"class":873,"line":881},[871,1953,1705],{"class":1699},[871,1955,1956],{"class":1708},"directory",[871,1958,1712],{"class":1699},[871,1960,1715],{"class":1699},[871,1962,1718],{"class":1699},[871,1964,1965],{"class":1721},"/Users/you/Music/demos",[871,1967,1712],{"class":1699},[871,1969,1727],{"class":1699},[871,1971,1972,1974,1977,1979,1981,1984],{"class":873,"line":887},[871,1973,1705],{"class":1699},[871,1975,1976],{"class":1708},"total_files",[871,1978,1712],{"class":1699},[871,1980,1715],{"class":1699},[871,1982,1983],{"class":1761}," 3",[871,1985,1727],{"class":1699},[871,1987,1988,1990,1993,1995,1997],{"class":873,"line":893},[871,1989,1705],{"class":1699},[871,1991,1992],{"class":1708},"files",[871,1994,1712],{"class":1699},[871,1996,1715],{"class":1699},[871,1998,1999],{"class":1699}," [\n",[871,2001,2002],{"class":873,"line":899},[871,2003,2004],{"class":1699},"    {\n",[871,2006,2007,2010,2012,2014,2016,2018,2021,2023],{"class":873,"line":905},[871,2008,2009],{"class":1699},"      \"",[871,2011,1709],{"class":1833},[871,2013,1712],{"class":1699},[871,2015,1715],{"class":1699},[871,2017,1718],{"class":1699},[871,2019,2020],{"class":1721},"idea-01.mp3",[871,2022,1712],{"class":1699},[871,2024,1727],{"class":1699},[871,2026,2027,2029,2032,2034,2036],{"class":873,"line":911},[871,2028,2009],{"class":1699},[871,2030,2031],{"class":1833},"has_metadata",[871,2033,1712],{"class":1699},[871,2035,1715],{"class":1699},[871,2037,2038],{"class":1699}," true,\n",[871,2040,2041,2043,2046,2048,2050,2053,2055,2057,2059,2062,2064,2066,2068],{"class":873,"line":917},[871,2042,2009],{"class":1699},[871,2044,2045],{"class":1833},"fields_present",[871,2047,1712],{"class":1699},[871,2049,1715],{"class":1699},[871,2051,2052],{"class":1699}," [",[871,2054,1712],{"class":1699},[871,2056,1834],{"class":1721},[871,2058,1712],{"class":1699},[871,2060,2061],{"class":1699},",",[871,2063,1718],{"class":1699},[871,2065,1854],{"class":1721},[871,2067,1712],{"class":1699},[871,2069,2070],{"class":1699},"],\n",[871,2072,2073,2075,2078,2080,2082,2084,2086,2089,2091,2093,2095,2098,2100,2102,2104,2106,2108,2110,2112,2115,2117],{"class":873,"line":923},[871,2074,2009],{"class":1699},[871,2076,2077],{"class":1833},"fields_missing",[871,2079,1712],{"class":1699},[871,2081,1715],{"class":1699},[871,2083,2052],{"class":1699},[871,2085,1712],{"class":1699},[871,2087,2088],{"class":1721},"album",[871,2090,1712],{"class":1699},[871,2092,2061],{"class":1699},[871,2094,1718],{"class":1699},[871,2096,2097],{"class":1721},"date",[871,2099,1712],{"class":1699},[871,2101,2061],{"class":1699},[871,2103,1718],{"class":1699},[871,2105,1874],{"class":1721},[871,2107,1712],{"class":1699},[871,2109,2061],{"class":1699},[871,2111,1718],{"class":1699},[871,2113,2114],{"class":1721},"isrc",[871,2116,1712],{"class":1699},[871,2118,2119],{"class":1699},"]\n",[871,2121,2122],{"class":873,"line":930},[871,2123,2124],{"class":1699},"    },\n",[871,2126,2127],{"class":873,"line":936},[871,2128,2004],{"class":1699},[871,2130,2131,2133,2135,2137,2139,2141,2144,2146],{"class":873,"line":942},[871,2132,2009],{"class":1699},[871,2134,1709],{"class":1833},[871,2136,1712],{"class":1699},[871,2138,1715],{"class":1699},[871,2140,1718],{"class":1699},[871,2142,2143],{"class":1721},"sketch.flac",[871,2145,1712],{"class":1699},[871,2147,1727],{"class":1699},[871,2149,2150,2152,2154,2156,2158],{"class":873,"line":948},[871,2151,2009],{"class":1699},[871,2153,2031],{"class":1833},[871,2155,1712],{"class":1699},[871,2157,1715],{"class":1699},[871,2159,2160],{"class":1699}," false,\n",[871,2162,2163,2165,2167,2169,2171],{"class":873,"line":954},[871,2164,2009],{"class":1699},[871,2166,2045],{"class":1833},[871,2168,1712],{"class":1699},[871,2170,1715],{"class":1699},[871,2172,2173],{"class":1699}," [],\n",[871,2175,2176,2178,2180,2182,2184,2186,2188,2190,2192,2194,2196,2198,2200,2202,2204,2206,2208,2210,2212,2214,2216,2218,2220,2222,2224,2226,2228,2230,2232],{"class":873,"line":960},[871,2177,2009],{"class":1699},[871,2179,2077],{"class":1833},[871,2181,1712],{"class":1699},[871,2183,1715],{"class":1699},[871,2185,2052],{"class":1699},[871,2187,1712],{"class":1699},[871,2189,1834],{"class":1721},[871,2191,1712],{"class":1699},[871,2193,2061],{"class":1699},[871,2195,1718],{"class":1699},[871,2197,1854],{"class":1721},[871,2199,1712],{"class":1699},[871,2201,2061],{"class":1699},[871,2203,1718],{"class":1699},[871,2205,2088],{"class":1721},[871,2207,1712],{"class":1699},[871,2209,2061],{"class":1699},[871,2211,1718],{"class":1699},[871,2213,2097],{"class":1721},[871,2215,1712],{"class":1699},[871,2217,2061],{"class":1699},[871,2219,1718],{"class":1699},[871,2221,1874],{"class":1721},[871,2223,1712],{"class":1699},[871,2225,2061],{"class":1699},[871,2227,1718],{"class":1699},[871,2229,2114],{"class":1721},[871,2231,1712],{"class":1699},[871,2233,2119],{"class":1699},[871,2235,2236],{"class":873,"line":966},[871,2237,2238],{"class":1699},"    }\n",[871,2240,2241],{"class":873,"line":972},[871,2242,2243],{"class":1699},"  ]\n",[871,2245,2246],{"class":873,"line":978},[871,2247,1896],{"class":1699},[748,2249,2250],{},[844,2251],{"alt":2252,"src":2253},"Scanning a music library in Claude Code","/images/blog/musictechlab_blog_mtl-metadata-mcp-scan.webp",[748,2255,2256],{},"You can then follow up with batch commands:",[862,2258,2261],{"className":2259,"code":2260,"language":1682,"meta":867},[1680],"> Set ISRC codes USAB12300001 through USAB12300003 on each track in order\n",[800,2262,2260],{"__ignoreMap":867},[834,2264,2266],{"id":2265},"more-prompt-ideas","More prompt ideas",[748,2268,2269],{},"Here are some real-world prompts you can try:",[862,2271,2274],{"className":2272,"code":2273,"language":1682,"meta":867},[1680],"> Read the metadata from all files in ~/Music/masters and show me a summary table\n",[800,2275,2273],{"__ignoreMap":867},[862,2277,2280],{"className":2278,"code":2279,"language":1682,"meta":867},[1680],"> Change the artist on demo-v3.mp3 from \"Unknown\" to \"Jane Doe\"\n",[800,2281,2279],{"__ignoreMap":867},[862,2283,2286],{"className":2284,"code":2285,"language":1682,"meta":867},[1680],"> Which files in ~/Music/releases have no genre tag?\n",[800,2287,2285],{"__ignoreMap":867},[862,2289,2292],{"className":2290,"code":2291,"language":1682,"meta":867},[1680],"> Copy the metadata from track-01.mp3 and apply it to track-01-remastered.mp3\n",[800,2293,2291],{"__ignoreMap":867},[862,2295,2298],{"className":2296,"code":2297,"language":1682,"meta":867},[1680],"> Strip all metadata from every file in ~/Music/stems\n",[800,2299,2297],{"__ignoreMap":867},[862,2301,2304],{"className":2302,"code":2303,"language":1682,"meta":867},[1680],"> Check if any FLAC files in ~/Music/archive are missing ISRC codes, then list them\n",[800,2305,2303],{"__ignoreMap":867},[862,2307,2310],{"className":2308,"code":2309,"language":1682,"meta":867},[1680],"> Set genre to \"Electronic\" on all MP3 files in ~/Music/ep that currently have no genre\n",[800,2311,2309],{"__ignoreMap":867},[1254,2313,2314],{},[748,2315,2316],{},"You can chain prompts naturally. Ask Claude to scan first, review the results, then tell it what to fix. The conversation context carries over, so Claude remembers which files it just scanned.",[752,2318,2320],{"id":2319},"tech-stack","Tech Stack",[760,2322,2325,2330,2335],{"className":2323},[763,764,2324,766,767],"md:grid-cols-3",[769,2326],{"description":2327,"icon":2328,"title":2329},"With Poetry for dependency management.","i-lucide-code","Python 3.10+",[769,2331],{"description":2332,"icon":2333,"title":2334},"Cross-format audio tag handling (ID3v2, Vorbis comments).","i-lucide-music","mutagen",[769,2336],{"description":2337,"icon":2338,"title":2339},"Model Context Protocol server framework.","i-lucide-cpu","FastMCP",[748,2341,2342],{},"The entire codebase is under 200 lines of core logic, plus 14 automated tests.",[752,2344,2346],{"id":2345},"getting-started","Getting Started",[834,2348,2350],{"id":2349},"installation","Installation",[862,2352,2356],{"className":2353,"code":2354,"language":2355,"meta":867,"style":867},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","git clone https://github.com/musictechlab/mtl-metadata-mcp.git\ncd mtl-metadata-mcp\npoetry install\n","bash",[800,2357,2358,2369,2378],{"__ignoreMap":867},[871,2359,2360,2363,2366],{"class":873,"line":874},[871,2361,2362],{"class":1833},"git",[871,2364,2365],{"class":1721}," clone",[871,2367,2368],{"class":1721}," https://github.com/musictechlab/mtl-metadata-mcp.git\n",[871,2370,2371,2375],{"class":873,"line":881},[871,2372,2374],{"class":2373},"s2Zo4","cd",[871,2376,2377],{"class":1721}," mtl-metadata-mcp\n",[871,2379,2380,2383],{"class":873,"line":887},[871,2381,2382],{"class":1833},"poetry",[871,2384,2385],{"class":1721}," install\n",[834,2387,2389],{"id":2388},"register-with-claude-code","Register with Claude Code",[862,2391,2393],{"className":2353,"code":2392,"language":2355,"meta":867,"style":867},"claude mcp add -s user mtl-metadata -- bash -c \"cd /path/to/mtl-metadata-mcp && poetry run python -m mtl_metadata_mcp\"\n",[800,2394,2395],{"__ignoreMap":867},[871,2396,2397,2400,2403,2406,2409,2412,2415,2418,2421,2424,2426,2429],{"class":873,"line":874},[871,2398,2399],{"class":1833},"claude",[871,2401,2402],{"class":1721}," mcp",[871,2404,2405],{"class":1721}," add",[871,2407,2408],{"class":1721}," -s",[871,2410,2411],{"class":1721}," user",[871,2413,2414],{"class":1721}," mtl-metadata",[871,2416,2417],{"class":1721}," --",[871,2419,2420],{"class":1721}," bash",[871,2422,2423],{"class":1721}," -c",[871,2425,1718],{"class":1699},[871,2427,2428],{"class":1721},"cd /path/to/mtl-metadata-mcp && poetry run python -m mtl_metadata_mcp",[871,2430,1886],{"class":1699},[748,2432,2433],{},"Restart Claude Code, and the four metadata tools are available immediately.",[1254,2435,2436],{},[748,2437,2438,2439,2442,2443,2446],{},"You can verify the server is connected by running ",[800,2440,2441],{},"claude mcp list"," - look for ",[800,2444,2445],{},"mtl-metadata"," in the output.",[752,2448,2450],{"id":2449},"what-is-next","What is Next",[748,2452,2453],{},"This is version 0.1.0. Here is what we are considering for future releases:",[760,2455,2457,2462,2467,2471],{"className":2456},[763,764,765,766,767],[769,2458],{"description":2459,"icon":2460,"title":2461},"Broadcast Wave Format (BWF) metadata for production and mastering workflows.","i-lucide-file-audio","WAV Support",[769,2463],{"description":2464,"icon":2465,"title":2466},"Embed and extract album artwork directly from audio files.","i-lucide-image","Cover Art",[769,2468],{"description":2469,"icon":1354,"title":2470},"A dedicated tool for applying metadata changes across entire folders in one go.","Batch Operations",[769,2472],{"description":2473,"icon":2474,"title":2475},"Map metadata fields to DDEX ERN standards for catalog delivery workflows.","i-lucide-arrow-right-left","DDEX Field Mapping",[748,2477,2478,2479,2484],{},"Have an idea for a feature we have not thought of? We would love to hear it. ",[828,2480,2483],{"href":2481,"rel":2482},"https://musictechlab.io/contact",[1276],"Let's connect"," and shape the roadmap together.",[752,2486,1490],{"id":2487},"open-source",[748,2489,2490],{},"mtl-metadata-mcp is MIT licensed and available on GitHub:",[748,2492,2493],{},[828,2494,2497],{"href":2495,"rel":2496},"https://github.com/musictechlab/mtl-metadata-mcp",[1276],"github.com/musictechlab/mtl-metadata-mcp",[812,2499,2500],{},[748,2501,2502],{},"This project is experimental and in early development. Always back up your audio files before modifying metadata.",[748,2504,2505],{},"Contributions, issues, and feature requests are welcome. If you work with music catalogs and want to streamline your metadata workflow, give it a try and let us know what you think.",[1409,2507,2508],{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}",{"title":867,"searchDepth":881,"depth":881,"links":2510},[2511,2512,2513,2514,2520,2521,2525,2526],{"id":1517,"depth":881,"text":1518},{"id":1550,"depth":881,"text":1551},{"id":1580,"depth":881,"text":1581},{"id":1665,"depth":881,"text":1666,"children":2515},[2516,2517,2518,2519],{"id":1672,"depth":887,"text":1673},{"id":1908,"depth":887,"text":1909},{"id":1930,"depth":887,"text":1931},{"id":2265,"depth":887,"text":2266},{"id":2319,"depth":881,"text":2320},{"id":2345,"depth":881,"text":2346,"children":2522},[2523,2524],{"id":2349,"depth":887,"text":2350},{"id":2388,"depth":887,"text":2389},{"id":2449,"depth":881,"text":2450},{"id":2487,"depth":881,"text":1490},"2026-03-16T00:00:00.000Z","We built an open source MCP server that reads and writes metadata tags in MP3, FLAC, and OGG files directly from Claude Code. Here is how it works.",[2530,2533,2536,2539],{"question":2531,"answer":2532},"What is mtl-metadata-mcp?","It is an open source MCP (Model Context Protocol) server that lets Claude Code read and write metadata tags like title, artist, album, date, genre, and ISRC in audio files.",{"question":2534,"answer":2535},"What audio formats are supported?","MP3 (ID3v2 tags), FLAC (Vorbis comments), and OGG (Vorbis comments).",{"question":2537,"answer":2538},"How do I install mtl-metadata-mcp?","Clone the repo, run poetry install, and register it with Claude Code using the claude mcp add command.",{"question":2540,"answer":2541},"What is an ISRC code?","The International Standard Recording Code (ISRC) is a unique identifier assigned to each sound recording, used globally for tracking royalties and rights.",{"src":2543},"/images/blog/musictechlab_blog_mtl-metadata-mcp.webp",{"enabled":926,"items":2545},[2546,2548,2551,2553],{"text":2547,"icon":2333},"Read, write, scan, and clear audio metadata in MP3, FLAC, and OGG from natural language.",{"text":2549,"icon":2550},"Directory scanning flags files with missing ISRC codes, genres, or other required tags.","i-lucide-search",{"text":2552,"icon":2328},"The entire codebase is under 200 lines of core logic with 14 automated tests.",{"text":2554,"icon":2555},"MIT licensed and open source; installs with Poetry and registers with Claude Code.","i-lucide-terminal",{},{"title":2558,"description":2559},"mtl-metadata-mcp: Audio Metadata MCP Server | MusicTech Lab","Open source MCP server for reading and embedding metadata in MP3, FLAC, and OGG files. Built for Claude Code by MusicTech Lab.",[2561,1470,2487,2562,1476,2563,1469],"MCP","Claude Code","ID3","CP2xAS2yFqouqpSWlZPeceXbI6TnPGJVuje3o0ef4_Y",{"id":2566,"title":104,"authors":2567,"badge":1428,"body":2570,"category":1427,"client":1428,"date":2574,"description":2575,"extension":1431,"faq":1428,"featured":69,"featuredOrder":1428,"hidden":69,"image":2576,"keyTakeaways":1428,"meta":2578,"navigation":926,"path":105,"seo":2579,"status":2580,"stem":106,"tags":2581,"teaser":2585,"__hash__":2586,"score":887},"posts/blog/music-data/broken-feedback-loop-music-collaboration.md",[2568],{"name":738,"to":739,"avatar":2569},{"src":741},{"type":745,"value":2571,"toc":2572},[],{"title":867,"searchDepth":881,"depth":881,"links":2573},[],"2026-05-15T00:00:00.000Z","Sharing a rough idea with a collaborator requires exporting, uploading, sending a link, then getting feedback via text. There's no Google Docs-style commenting for audio.",{"src":2577},"/images/blog/musictechlab_blog_broken-feedback-loop.webp",{},{"title":104,"description":2575},"upcoming",[1476,2582,2583,2584],"collaboration","audio","workflow","We'll break down why early-stage music collaboration is stuck in email/Dropbox workflows, and what a purpose-built feedback system for audio would look like.","pAu-d12ERlpdiPRo3RGjGEYKeWrQN4_82-4o3c8whjQ",{"id":2588,"title":168,"authors":2589,"badge":2592,"body":2593,"category":1427,"client":1428,"date":3751,"description":3752,"extension":1431,"faq":3753,"featured":69,"featuredOrder":1428,"hidden":69,"image":3765,"keyTakeaways":3767,"meta":3778,"navigation":926,"path":169,"seo":3779,"status":1428,"stem":170,"tags":3782,"teaser":1428,"__hash__":3786,"score":887},"posts/blog/music-data/mtl-bandcamp-mcp-open-source-revenue-dashboard.md",[2590],{"name":738,"to":739,"avatar":2591},{"src":741},{"label":1490,"color":1491},{"type":745,"value":2594,"toc":3725},[2595,2602,2607,2609,2615,2637,2644,2646,2649,2670,2677,2681,2685,2738,2742,2795,2799,2866,2868,2871,2875,2878,2884,2887,2900,2968,2972,2978,2981,3084,3088,3094,3213,3228,3232,3238,3241,3243,3246,3335,3340,3344,3347,3353,3412,3418,3485,3491,3536,3539,3543,3546,3548,3560,3563,3565,3567,3594,3596,3629,3633,3640,3658,3661,3670,3672,3674,3697,3702,3704,3707,3714,3719,3722],[748,2596,2597,2598,2601],{},"Every music label running on Bandcamp gets monthly CSV revenue reports. These files contain everything: gross revenue, net payouts, fee breakdowns, artist splits, and catalog details. But opening them in a spreadsheet means manual filtering, pivot tables, and context switching. We built ",[1231,2599,2600],{},"mtl-bandcamp-mcp"," so you can query your Bandcamp earnings using natural language, without leaving the terminal.",[812,2603,2604],{},[748,2605,2606],{},"All artist names, revenue figures, and catalog numbers in this article are fictional. We use fake data throughout to demonstrate the tool's capabilities.",[752,2608,1518],{"id":1517},[748,2610,2611,2612,2614],{},"At MusicTech Lab, we built ",[828,2613,831],{"href":830}," - a music distribution and analytics product. As part of that platform, we wrote an adapter that ingests Bandcamp revenue reports into our data pipeline. It is not something we work on daily - Bandcamp is one of many data sources - but when a new CSV export arrives, we need quick answers without opening a spreadsheet. An MCP server turned out to be the perfect fit: it lets us query reports on demand and could eventually help us integrate and debug the adapter within the broader data pipeline:",[760,2616,2618,2623,2628,2633],{"className":2617},[763,764,765,766,767],[769,2619],{"description":2620,"icon":2621,"title":2622},"See totals, margins, and fee breakdowns at a glance.","i-lucide-layout-dashboard","Dashboard view",[769,2624],{"description":2625,"icon":2626,"title":2627},"Revenue grouped by artist with share percentages.","i-lucide-users","Artist splits",[769,2629],{"description":2630,"icon":2631,"title":2632},"Rank items by net revenue, gross revenue, or quantity sold.","i-lucide-trophy","Top sellers",[769,2634],{"description":2635,"icon":2550,"title":2636},"Full detail for any catalog number including UPC, ISRC, and region.","Item lookup",[748,2638,2639,2640,2643],{},"Since we already use Claude Code for development, building an MCP server was the natural choice. We took a similar approach with our ",[828,2641,2642],{"href":85},"AI-powered analytics dashboard",", where business users query streaming royalty data in plain English and get interactive charts back.",[752,2645,1551],{"id":1550},[748,2647,2648],{},"mtl-bandcamp-mcp exposes five tools:",[760,2650,2652,2657,2661,2665],{"className":2651},[763,764,765,766,767],[769,2653],{"description":2654,"icon":2655,"title":2656},"List available Bandcamp CSV report files in the configured reports directory.","i-lucide-folder-open","bandcamp_list_reports",[769,2658],{"description":2659,"icon":1457,"title":2660},"Dashboard summary with totals, net margin, and a full fee breakdown by category.","bandcamp_summary",[769,2662],{"description":2663,"icon":2626,"title":2664},"Revenue grouped by artist showing quantity, gross, net, and share of total.","bandcamp_by_artist",[769,2666],{"description":2667,"icon":2668,"title":2669},"Top-selling items sorted by net revenue, gross revenue, or quantity.","i-lucide-arrow-up-down","bandcamp_top_items",[760,2671,2673],{"className":2672},[763,764,765,766,767],[769,2674],{"description":2675,"icon":1561,"title":2676},"Full detail for a specific catalog number: UPC, ISRC, region, all fees, and net revenue.","bandcamp_item_detail",[752,2678,2680],{"id":2679},"dashboard-fields","Dashboard Fields",[834,2682,2684],{"id":2683},"summary-metrics","Summary metrics",[1122,2686,2687,2696],{},[1125,2688,2689],{},[1128,2690,2691,2694],{},[1131,2692,2693],{},"Metric",[1131,2695,1593],{},[1138,2697,2698,2706,2714,2722,2730],{},[1128,2699,2700,2703],{},[1143,2701,2702],{},"Items sold",[1143,2704,2705],{},"Total quantity across all line items",[1128,2707,2708,2711],{},[1143,2709,2710],{},"Unique artists",[1143,2712,2713],{},"Number of distinct artists in the report",[1128,2715,2716,2719],{},[1143,2717,2718],{},"Gross revenue",[1143,2720,2721],{},"Total revenue before deductions",[1128,2723,2724,2727],{},[1143,2725,2726],{},"Net revenue",[1143,2728,2729],{},"Revenue after all fees and taxes",[1128,2731,2732,2735],{},[1143,2733,2734],{},"Net margin",[1143,2736,2737],{},"Net as a percentage of gross",[834,2739,2741],{"id":2740},"fee-breakdown","Fee breakdown",[1122,2743,2744,2753],{},[1125,2745,2746],{},[1128,2747,2748,2751],{},[1131,2749,2750],{},"Fee type",[1131,2752,1593],{},[1138,2754,2755,2763,2771,2779,2787],{},[1128,2756,2757,2760],{},[1143,2758,2759],{},"Taxes",[1143,2761,2762],{},"VAT and other taxes collected",[1128,2764,2765,2768],{},[1143,2766,2767],{},"Bandcamp share",[1143,2769,2770],{},"Bandcamp's assessed revenue share",[1128,2772,2773,2776],{},[1143,2774,2775],{},"Collection society",[1143,2777,2778],{},"Royalty collection society share",[1128,2780,2781,2784],{},[1143,2782,2783],{},"Payment processing",[1143,2785,2786],{},"Payment processor fees",[1128,2788,2789,2792],{},[1143,2790,2791],{},"Shipping",[1143,2793,2794],{},"Physical goods shipping costs",[834,2796,2798],{"id":2797},"item-detail","Item detail",[1122,2800,2801,2811],{},[1125,2802,2803],{},[1128,2804,2805,2807,2809],{},[1131,2806,1590],{},[1131,2808,1593],{},[1131,2810,1596],{},[1138,2812,2813,2824,2835,2844,2855],{},[1128,2814,2815,2818,2821],{},[1143,2816,2817],{},"Cat no.",[1143,2819,2820],{},"Catalog number",[1143,2822,2823],{},"\"MDL-2939\"",[1128,2825,2826,2829,2832],{},[1143,2827,2828],{},"UPC",[1143,2830,2831],{},"Universal Product Code",[1143,2833,2834],{},"\"5060000000001\"",[1128,2836,2837,2839,2841],{},[1143,2838,1469],{},[1143,2840,1659],{},[1143,2842,2843],{},"\"GBAP01900028\"",[1128,2845,2846,2849,2852],{},[1143,2847,2848],{},"Item type",[1143,2850,2851],{},"Track, album, or merch",[1143,2853,2854],{},"\"track\"",[1128,2856,2857,2860,2863],{},[1143,2858,2859],{},"Region",[1143,2861,2862],{},"Buyer's region",[1143,2864,2865],{},"\"United Kingdom\"",[752,2867,1666],{"id":1665},[748,2869,2870],{},"Once installed, you just talk to Claude Code. No spreadsheet formulas, no pivot tables, no context switching.",[834,2872,2874],{"id":2873},"viewing-the-dashboard","Viewing the dashboard",[748,2876,2877],{},"Ask Claude for a summary:",[862,2879,2882],{"className":2880,"code":2881,"language":1682,"meta":867},[1680],"> Show me a summary of my latest Bandcamp revenue report\n",[800,2883,2881],{"__ignoreMap":867},[748,2885,2886],{},"Claude finds the most recent CSV and returns a formatted dashboard:",[748,2888,2889,2892,2893,2896,2899],{},[1231,2890,2891],{},"Report:"," ",[800,2894,2895],{},"bandcamp-rev-report-2026-q1.csv",[1231,2897,2898],{},"Period:"," 2026-01-01 to 2026-03-31",[1122,2901,2902,2911],{},[1125,2903,2904],{},[1128,2905,2906,2908],{},[1131,2907,2693],{},[1131,2909,2910],{},"Value",[1138,2912,2913,2920,2928,2935,2942,2950,2961],{},[1128,2914,2915,2917],{},[1143,2916,2702],{},[1143,2918,2919],{},"847",[1128,2921,2922,2925],{},[1143,2923,2924],{},"Line items",[1143,2926,2927],{},"312",[1128,2929,2930,2932],{},[1143,2931,2710],{},[1143,2933,2934],{},"24",[1128,2936,2937,2939],{},[1143,2938,2718],{},[1143,2940,2941],{},"12,450.00 GBP",[1128,2943,2944,2947],{},[1143,2945,2946],{},"Total deductions",[1143,2948,2949],{},"3,290.75 GBP",[1128,2951,2952,2956],{},[1143,2953,2954],{},[1231,2955,2726],{},[1143,2957,2958],{},[1231,2959,2960],{},"9,159.25 GBP",[1128,2962,2963,2965],{},[1143,2964,2734],{},[1143,2966,2967],{},"73.6%",[834,2969,2971],{"id":2970},"checking-artist-splits","Checking artist splits",[862,2973,2976],{"className":2974,"code":2975,"language":1682,"meta":867},[1680],"> Which artists earned the most this quarter?\n",[800,2977,2975],{"__ignoreMap":867},[748,2979,2980],{},"Claude groups revenue by artist and shows each one's share:",[1122,2982,2983,3004],{},[1125,2984,2985],{},[1128,2986,2987,2989,2992,2995,2998,3001],{},[1131,2988,1614],{},[1131,2990,2991],{},"Items",[1131,2993,2994],{},"Qty Sold",[1131,2996,2997],{},"Gross",[1131,2999,3000],{},"Net",[1131,3002,3003],{},"Share",[1138,3005,3006,3026,3046,3065],{},[1128,3007,3008,3011,3014,3017,3020,3023],{},[1143,3009,3010],{},"Solar Cole",[1143,3012,3013],{},"3",[1143,3015,3016],{},"18",[1143,3018,3019],{},"167.27 GBP",[1143,3021,3022],{},"129.38 GBP",[1143,3024,3025],{},"53.9%",[1128,3027,3028,3031,3034,3037,3040,3043],{},[1143,3029,3030],{},"The Fox Alliance",[1143,3032,3033],{},"1",[1143,3035,3036],{},"6",[1143,3038,3039],{},"64.55 GBP",[1143,3041,3042],{},"53.11 GBP",[1143,3044,3045],{},"22.1%",[1128,3047,3048,3051,3053,3056,3059,3062],{},[1143,3049,3050],{},"Midnight Storm",[1143,3052,3033],{},[1143,3054,3055],{},"4",[1143,3057,3058],{},"33.57 GBP",[1143,3060,3061],{},"28.81 GBP",[1143,3063,3064],{},"12.0%",[1128,3066,3067,3070,3073,3075,3078,3081],{},[1143,3068,3069],{},"Iris Grove",[1143,3071,3072],{},"2",[1143,3074,3072],{},[1143,3076,3077],{},"16.80 GBP",[1143,3079,3080],{},"11.72 GBP",[1143,3082,3083],{},"4.9%",[834,3085,3087],{"id":3086},"finding-top-sellers","Finding top sellers",[862,3089,3092],{"className":3090,"code":3091,"language":1682,"meta":867},[1680],"> What are the top 5 items by quantity sold?\n",[800,3093,3091],{"__ignoreMap":867},[1122,3095,3096,3118],{},[1125,3097,3098],{},[1128,3099,3100,3103,3106,3108,3111,3114,3116],{},[1131,3101,3102],{},"#",[1131,3104,3105],{},"Item",[1131,3107,1614],{},[1131,3109,3110],{},"Type",[1131,3112,3113],{},"Qty",[1131,3115,2997],{},[1131,3117,3000],{},[1138,3119,3120,3140,3157,3176,3193],{},[1128,3121,3122,3124,3127,3129,3131,3134,3137],{},[1143,3123,3033],{},[1143,3125,3126],{},"The Little Fantasies",[1143,3128,3010],{},[1143,3130,2088],{},[1143,3132,3133],{},"9",[1143,3135,3136],{},"83.87 GBP",[1143,3138,3139],{},"64.31 GBP",[1128,3141,3142,3144,3147,3149,3151,3153,3155],{},[1143,3143,3072],{},[1143,3145,3146],{},"Short Dreams",[1143,3148,3030],{},[1143,3150,2088],{},[1143,3152,3036],{},[1143,3154,3039],{},[1143,3156,3042],{},[1128,3158,3159,3161,3164,3166,3168,3170,3173],{},[1143,3160,3013],{},[1143,3162,3163],{},"The Open Offerings",[1143,3165,3010],{},[1143,3167,2088],{},[1143,3169,3036],{},[1143,3171,3172],{},"55.02 GBP",[1143,3174,3175],{},"44.01 GBP",[1128,3177,3178,3180,3183,3185,3187,3189,3191],{},[1143,3179,3055],{},[1143,3181,3182],{},"The Broad Chorus",[1143,3184,3050],{},[1143,3186,2088],{},[1143,3188,3055],{},[1143,3190,3058],{},[1143,3192,3061],{},[1128,3194,3195,3198,3201,3203,3205,3207,3210],{},[1143,3196,3197],{},"5",[1143,3199,3200],{},"Premier Visions",[1143,3202,3010],{},[1143,3204,2088],{},[1143,3206,3013],{},[1143,3208,3209],{},"28.38 GBP",[1143,3211,3212],{},"21.06 GBP",[748,3214,3215,3216,3219,3220,3223,3224,3227],{},"You can sort by ",[800,3217,3218],{},"net",", ",[800,3221,3222],{},"gross",", or ",[800,3225,3226],{},"quantity"," and set any limit.",[834,3229,3231],{"id":3230},"looking-up-a-specific-item","Looking up a specific item",[862,3233,3236],{"className":3234,"code":3235,"language":1682,"meta":867},[1680],"> Show me all the details for catalog number MDL-2939\n",[800,3237,3235],{"__ignoreMap":867},[748,3239,3240],{},"Claude returns every field for that item: UPC, ISRC, region, item type, and a full fee breakdown.",[834,3242,2266],{"id":2265},[748,3244,3245],{},"Here are some real-world prompts you can try. Click each one to see the result:",[760,3247,3250,3275,3290,3305,3320],{"className":3248},[3249,767],"space-y-2",[3251,3252,3260,3264],"details",{"className":3253},[3254,3255,3256,3257,3258,3259],"rounded-lg","border","border-gray-700","px-4","py-3","cursor-pointer",[3261,3262,3263],"summary",{},"List all available Bandcamp reports",[760,3265,3269],{"className":3266},[3267,3254,3255,3256,3268],"mt-4","overflow-hidden",[748,3270,3271],{},[844,3272],{"alt":3273,"src":3274},"Listing available Bandcamp reports in Claude Code","/images/blog/musictechlab_blog_mtl-bandcamp-mcp-list-reports.webp",[3251,3276,3278,3281],{"className":3277},[3254,3255,3256,3257,3258,3259],[3261,3279,3280],{},"What are the top 5 items by quantity sold?",[760,3282,3284],{"className":3283},[3267,3254,3255,3256,3268],[748,3285,3286],{},[844,3287],{"alt":3288,"src":3289},"Top 5 items by quantity sold in Claude Code","/images/blog/musictechlab_blog_mtl-bandcamp-mcp-top-items.webp",[3251,3291,3293,3296],{"className":3292},[3254,3255,3256,3257,3258,3259],[3261,3294,3295],{},"How much did we pay in Bandcamp fees this quarter?",[760,3297,3299],{"className":3298},[3267,3254,3255,3256,3268],[748,3300,3301],{},[844,3302],{"alt":3303,"src":3304},"Bandcamp fee breakdown in Claude Code","/images/blog/musictechlab_blog_mtl-bandcamp-mcp-fees.webp",[3251,3306,3308,3311],{"className":3307},[3254,3255,3256,3257,3258,3259],[3261,3309,3310],{},"Which artist has the best net margin?",[760,3312,3314],{"className":3313},[3267,3254,3255,3256,3268],[748,3315,3316],{},[844,3317],{"alt":3318,"src":3319},"Artist net margin analysis in Claude Code","/images/blog/musictechlab_blog_mtl-bandcamp-mcp-margin.webp",[3251,3321,3323,3326],{"className":3322},[3254,3255,3256,3257,3258,3259],[3261,3324,3325],{},"Show me the fee breakdown — what percentage goes to taxes vs Bandcamp vs payment processing?",[760,3327,3329],{"className":3328},[3267,3254,3255,3256,3268],[748,3330,3331],{},[844,3332],{"alt":3333,"src":3334},"Fee breakdown by percentage in Claude Code","/images/blog/musictechlab_blog_mtl-bandcamp-mcp-fee-breakdown.webp",[1254,3336,3337],{},[748,3338,3339],{},"You can chain prompts naturally. Ask Claude for a summary first, then drill into a specific artist or item. The conversation context carries over, so Claude remembers the report it just loaded.",[834,3341,3343],{"id":3342},"visualizing-the-data","Visualizing the data",[748,3345,3346],{},"You can also generate charts from the report data. Just ask:",[862,3348,3351],{"className":3349,"code":3350,"language":1682,"meta":867},[1680],"> Show me which artists earned the most as a chart\n",[800,3352,3350],{"__ignoreMap":867},[862,3354,3356],{"className":864,"code":3355,"language":866,"meta":867,"style":867},"---\nconfig:\n    xyChart:\n        width: 800\n        height: 500\n---\nxychart-beta\n    title \"Net Revenue by Artist (GBP)\"\n    x-axis [\"Solar Cole\", \"Fox Alliance\", \"Midnight Storm\", \"Iris Grove\", \"Shaw Protocol\", \"Orion Webb\", \"Zane Element\"]\n    y-axis \"Net Revenue (GBP)\" 0 --> 140\n    bar [129.38, 53.11, 28.81, 11.72, 9.42, 6.82, 0.78]\n",[800,3357,3358,3363,3368,3373,3378,3383,3387,3392,3397,3402,3407],{"__ignoreMap":867},[871,3359,3360],{"class":873,"line":874},[871,3361,3362],{"class":877},"---\n",[871,3364,3365],{"class":873,"line":881},[871,3366,3367],{"class":877},"config:\n",[871,3369,3370],{"class":873,"line":887},[871,3371,3372],{"class":877},"    xyChart:\n",[871,3374,3375],{"class":873,"line":893},[871,3376,3377],{"class":877},"        width: 800\n",[871,3379,3380],{"class":873,"line":899},[871,3381,3382],{"class":877},"        height: 500\n",[871,3384,3385],{"class":873,"line":905},[871,3386,3362],{"class":877},[871,3388,3389],{"class":873,"line":911},[871,3390,3391],{"class":877},"xychart-beta\n",[871,3393,3394],{"class":873,"line":917},[871,3395,3396],{"class":877},"    title \"Net Revenue by Artist (GBP)\"\n",[871,3398,3399],{"class":873,"line":923},[871,3400,3401],{"class":877},"    x-axis [\"Solar Cole\", \"Fox Alliance\", \"Midnight Storm\", \"Iris Grove\", \"Shaw Protocol\", \"Orion Webb\", \"Zane Element\"]\n",[871,3403,3404],{"class":873,"line":930},[871,3405,3406],{"class":877},"    y-axis \"Net Revenue (GBP)\" 0 --> 140\n",[871,3408,3409],{"class":873,"line":936},[871,3410,3411],{"class":877},"    bar [129.38, 53.11, 28.81, 11.72, 9.42, 6.82, 0.78]\n",[862,3413,3416],{"className":3414,"code":3415,"language":1682,"meta":867},[1680],"> Show me the revenue share breakdown as a pie chart\n",[800,3417,3415],{"__ignoreMap":867},[862,3419,3421],{"className":864,"code":3420,"language":866,"meta":867,"style":867},"---\nconfig:\n    pie:\n        useWidth: 700\n---\npie title Revenue Share by Artist\n    \"Solar Cole\" : 53.9\n    \"The Fox Alliance\" : 22.1\n    \"Midnight Storm\" : 12.0\n    \"Iris Grove\" : 4.9\n    \"The Shaw Protocol\" : 3.9\n    \"Orion Webb\" : 2.8\n    \"The Zane Element\" : 0.3\n",[800,3422,3423,3427,3431,3436,3441,3445,3450,3455,3460,3465,3470,3475,3480],{"__ignoreMap":867},[871,3424,3425],{"class":873,"line":874},[871,3426,3362],{"class":877},[871,3428,3429],{"class":873,"line":881},[871,3430,3367],{"class":877},[871,3432,3433],{"class":873,"line":887},[871,3434,3435],{"class":877},"    pie:\n",[871,3437,3438],{"class":873,"line":893},[871,3439,3440],{"class":877},"        useWidth: 700\n",[871,3442,3443],{"class":873,"line":899},[871,3444,3362],{"class":877},[871,3446,3447],{"class":873,"line":905},[871,3448,3449],{"class":877},"pie title Revenue Share by Artist\n",[871,3451,3452],{"class":873,"line":911},[871,3453,3454],{"class":877},"    \"Solar Cole\" : 53.9\n",[871,3456,3457],{"class":873,"line":917},[871,3458,3459],{"class":877},"    \"The Fox Alliance\" : 22.1\n",[871,3461,3462],{"class":873,"line":923},[871,3463,3464],{"class":877},"    \"Midnight Storm\" : 12.0\n",[871,3466,3467],{"class":873,"line":930},[871,3468,3469],{"class":877},"    \"Iris Grove\" : 4.9\n",[871,3471,3472],{"class":873,"line":936},[871,3473,3474],{"class":877},"    \"The Shaw Protocol\" : 3.9\n",[871,3476,3477],{"class":873,"line":942},[871,3478,3479],{"class":877},"    \"Orion Webb\" : 2.8\n",[871,3481,3482],{"class":873,"line":948},[871,3483,3484],{"class":877},"    \"The Zane Element\" : 0.3\n",[862,3486,3489],{"className":3487,"code":3488,"language":1682,"meta":867},[1680],"> What percentage of fees goes to taxes vs Bandcamp vs payment processing?\n",[800,3490,3488],{"__ignoreMap":867},[862,3492,3494],{"className":864,"code":3493,"language":866,"meta":867,"style":867},"---\nconfig:\n    pie:\n        useWidth: 700\n---\npie title Fee Breakdown (% of Total Fees)\n    \"Taxes\" : 46.6\n    \"Bandcamp Share\" : 31.2\n    \"Payment Processing\" : 22.1\n",[800,3495,3496,3500,3504,3508,3512,3516,3521,3526,3531],{"__ignoreMap":867},[871,3497,3498],{"class":873,"line":874},[871,3499,3362],{"class":877},[871,3501,3502],{"class":873,"line":881},[871,3503,3367],{"class":877},[871,3505,3506],{"class":873,"line":887},[871,3507,3435],{"class":877},[871,3509,3510],{"class":873,"line":893},[871,3511,3440],{"class":877},[871,3513,3514],{"class":873,"line":899},[871,3515,3362],{"class":877},[871,3517,3518],{"class":873,"line":905},[871,3519,3520],{"class":877},"pie title Fee Breakdown (% of Total Fees)\n",[871,3522,3523],{"class":873,"line":911},[871,3524,3525],{"class":877},"    \"Taxes\" : 46.6\n",[871,3527,3528],{"class":873,"line":917},[871,3529,3530],{"class":877},"    \"Bandcamp Share\" : 31.2\n",[871,3532,3533],{"class":873,"line":923},[871,3534,3535],{"class":877},"    \"Payment Processing\" : 22.1\n",[748,3537,3538],{},"All charts are rendered inline, with the site's dark theme and brand styling. No spreadsheet, no BI tool, no context switching.",[752,3540,3542],{"id":3541},"handling-bandcamps-csv-format","Handling Bandcamp's CSV Format",[748,3544,3545],{},"Bandcamp exports revenue reports in UTF-16 encoding by default, which trips up most CSV parsers. mtl-bandcamp-mcp handles this transparently - it tries UTF-16 first, then falls back to UTF-8-sig and UTF-8. You never have to think about encoding issues.",[752,3547,2320],{"id":2319},[760,3549,3551,3553,3558],{"className":3550},[763,764,2324,766,767],[769,3552],{"description":2327,"icon":2328,"title":2329},[769,3554],{"description":3555,"icon":3556,"title":3557},"Standard library CSV parsing with smart encoding detection.","i-lucide-table","csv + io",[769,3559],{"description":2337,"icon":2338,"title":2339},[748,3561,3562],{},"The entire codebase is a single server module with clean, focused logic.",[752,3564,2346],{"id":2345},[834,3566,2350],{"id":2349},[862,3568,3570],{"className":2353,"code":3569,"language":2355,"meta":867,"style":867},"git clone https://github.com/musictechlab/mtl-bandcamp-mcp.git\ncd mtl-bandcamp-mcp\npoetry install\n",[800,3571,3572,3581,3588],{"__ignoreMap":867},[871,3573,3574,3576,3578],{"class":873,"line":874},[871,3575,2362],{"class":1833},[871,3577,2365],{"class":1721},[871,3579,3580],{"class":1721}," https://github.com/musictechlab/mtl-bandcamp-mcp.git\n",[871,3582,3583,3585],{"class":873,"line":881},[871,3584,2374],{"class":2373},[871,3586,3587],{"class":1721}," mtl-bandcamp-mcp\n",[871,3589,3590,3592],{"class":873,"line":887},[871,3591,2382],{"class":1833},[871,3593,2385],{"class":1721},[834,3595,2389],{"id":2388},[862,3597,3599],{"className":2353,"code":3598,"language":2355,"meta":867,"style":867},"claude mcp add -s user mtl-bandcamp -- bash -c \"cd /path/to/mtl-bandcamp-mcp && poetry run python -m mtl_bandcamp_mcp\"\n",[800,3600,3601],{"__ignoreMap":867},[871,3602,3603,3605,3607,3609,3611,3613,3616,3618,3620,3622,3624,3627],{"class":873,"line":874},[871,3604,2399],{"class":1833},[871,3606,2402],{"class":1721},[871,3608,2405],{"class":1721},[871,3610,2408],{"class":1721},[871,3612,2411],{"class":1721},[871,3614,3615],{"class":1721}," mtl-bandcamp",[871,3617,2417],{"class":1721},[871,3619,2420],{"class":1721},[871,3621,2423],{"class":1721},[871,3623,1718],{"class":1699},[871,3625,3626],{"class":1721},"cd /path/to/mtl-bandcamp-mcp && poetry run python -m mtl_bandcamp_mcp",[871,3628,1886],{"class":1699},[834,3630,3632],{"id":3631},"configuration","Configuration",[748,3634,3635,3636,3639],{},"Set ",[800,3637,3638],{},"BANDCAMP_REPORTS_DIR"," to point to the directory containing your Bandcamp CSV exports:",[862,3641,3643],{"className":2353,"code":3642,"language":2355,"meta":867,"style":867},"export BANDCAMP_REPORTS_DIR=~/Documents/bandcamp-reports\n",[800,3644,3645],{"__ignoreMap":867},[871,3646,3647,3649,3652,3655],{"class":873,"line":874},[871,3648,1170],{"class":1708},[871,3650,3651],{"class":877}," BANDCAMP_REPORTS_DIR",[871,3653,3654],{"class":1699},"=~",[871,3656,3657],{"class":877},"/Documents/bandcamp-reports\n",[748,3659,3660],{},"Restart Claude Code, and all five tools are available immediately.",[1254,3662,3663],{},[748,3664,2438,3665,2442,3667,2446],{},[800,3666,2441],{},[800,3668,3669],{},"mtl-bandcamp",[752,3671,2450],{"id":2449},[748,3673,2453],{},[760,3675,3677,3682,3687,3692],{"className":3676},[763,764,765,766,767],[769,3678],{"description":3679,"icon":3680,"title":3681},"Compare two reports side by side to spot revenue trends and growth.","i-lucide-git-compare","Period Comparison",[769,3683],{"description":3684,"icon":3685,"title":3686},"Revenue grouped by buyer region to understand geographic demand.","i-lucide-map","Regional Breakdown",[769,3688],{"description":3689,"icon":3690,"title":3691},"Track revenue over multiple reporting periods with growth indicators.","i-lucide-line-chart","Trend Analysis",[769,3693],{"description":3694,"icon":3695,"title":3696},"Push dashboard data directly to Google Sheets for sharing with stakeholders.","i-lucide-file-output","Export to Sheets",[748,3698,2478,3699,2484],{},[828,3700,2483],{"href":2481,"rel":3701},[1276],[752,3703,1490],{"id":2487},[748,3705,3706],{},"mtl-bandcamp-mcp is MIT licensed and available on GitHub:",[748,3708,3709],{},[828,3710,3713],{"href":3711,"rel":3712},"https://github.com/musictechlab/mtl-bandcamp-mcp",[1276],"github.com/musictechlab/mtl-bandcamp-mcp",[812,3715,3716],{},[748,3717,3718],{},"This project is experimental and in early development. Revenue data is read-only - the server never modifies your CSV files.",[748,3720,3721],{},"Contributions, issues, and feature requests are welcome. If you run a label on Bandcamp and want to streamline your revenue reporting, give it a try and let us know what you think.",[1409,3723,3724],{},"html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}",{"title":867,"searchDepth":881,"depth":881,"links":3726},[3727,3728,3729,3734,3742,3743,3744,3749,3750],{"id":1517,"depth":881,"text":1518},{"id":1550,"depth":881,"text":1551},{"id":2679,"depth":881,"text":2680,"children":3730},[3731,3732,3733],{"id":2683,"depth":887,"text":2684},{"id":2740,"depth":887,"text":2741},{"id":2797,"depth":887,"text":2798},{"id":1665,"depth":881,"text":1666,"children":3735},[3736,3737,3738,3739,3740,3741],{"id":2873,"depth":887,"text":2874},{"id":2970,"depth":887,"text":2971},{"id":3086,"depth":887,"text":3087},{"id":3230,"depth":887,"text":3231},{"id":2265,"depth":887,"text":2266},{"id":3342,"depth":887,"text":3343},{"id":3541,"depth":881,"text":3542},{"id":2319,"depth":881,"text":2320},{"id":2345,"depth":881,"text":2346,"children":3745},[3746,3747,3748],{"id":2349,"depth":887,"text":2350},{"id":2388,"depth":887,"text":2389},{"id":3631,"depth":887,"text":3632},{"id":2449,"depth":881,"text":2450},{"id":2487,"depth":881,"text":1490},"2026-03-20T00:00:00.000Z","An open source MCP server that turns Bandcamp CSV exports into queryable dashboards. Ask about artist splits, fee breakdowns, and top sellers — no spreadsheet needed.",[3754,3757,3760,3762],{"question":3755,"answer":3756},"What is mtl-bandcamp-mcp?","It is an open source MCP (Model Context Protocol) server that lets Claude Code parse Bandcamp revenue CSV exports and present interactive dashboards with summaries, artist breakdowns, and top-selling items.",{"question":3758,"answer":3759},"What file formats are supported?","Bandcamp CSV exports in both UTF-16 (Bandcamp default) and UTF-8 encodings.",{"question":3761,"answer":2538},"How do I install mtl-bandcamp-mcp?",{"question":3763,"answer":3764},"What data can I see in the dashboard?","Gross and net revenue, fee breakdowns (taxes, Bandcamp share, collection society, payment processing, shipping), revenue by artist with share percentages, top-selling items, and detailed catalog item views.",{"src":3766},"/images/blog/musictechlab_blog_mtl-bandcamp-mcp.webp",{"enabled":926,"items":3768},[3769,3771,3774,3776],{"text":3770,"icon":1457},"Query Bandcamp revenue CSVs with natural language, no spreadsheets or pivot tables needed.",{"text":3772,"icon":3773},"Five tools cover dashboard summaries, artist splits, top sellers, and catalog item lookups.","i-lucide-blocks",{"text":3775,"icon":1463},"Handles Bandcamp's UTF-16 encoding transparently with automatic fallback to UTF-8.",{"text":3777,"icon":2555},"MIT licensed and open source, installable with Poetry and Claude Code in under 5 minutes.",{},{"title":3780,"description":3781},"mtl-bandcamp-mcp: Bandcamp Revenue Dashboard MCP Server | MusicTech Lab","Open source MCP server for analyzing Bandcamp revenue CSV reports. Dashboard summaries, artist breakdowns, and top sellers inside Claude Code.",[2561,3783,2487,2562,1476,3784,3785],"Bandcamp","revenue","analytics","NsosocH7kjl1Sr0ml9fAVbkUSd8V4s07sXDgk675THk",{"id":3788,"title":120,"authors":3789,"badge":3793,"body":3796,"category":1427,"client":1428,"date":5681,"description":5682,"extension":1431,"faq":5683,"featured":69,"featuredOrder":1428,"hidden":69,"image":5693,"keyTakeaways":5695,"meta":5708,"navigation":926,"path":121,"seo":5709,"status":1428,"stem":122,"tags":5712,"teaser":1428,"__hash__":5717,"score":887},"posts/blog/music-data/c2pa-and-ddex-authenticity-meets-rights-in-the-age-of-ai-music.md",[3790],{"name":3791,"to":739,"avatar":3792},"Mariusz Smenżyk",{"src":741},{"label":3794,"color":3795},"Distribution","#0ea5e9",{"type":745,"value":3797,"toc":5654},[3798,3801,3818,3822,3825,3829,3832,3850,3857,3868,3872,3875,3903,3907,3910,3914,3917,3986,3991,3995,3998,4030,4037,4041,4207,4211,4214,4261,4265,4272,4275,4286,4290,4293,4297,4300,4311,4315,4318,4329,4344,4348,4351,4466,4477,4481,4484,4628,4632,4635,4644,4649,4666,4683,4687,4691,4698,5217,5221,5236,5519,5530,5534,5601,5605,5615,5618,5621,5648,5651],[748,3799,3800],{},"A track lands on a streaming platform. It sounds like a well-known artist, but was it actually recorded by them -or generated by an AI model trained on their catalog? And regardless of origin, who should receive the royalties?",[748,3802,3803,3804,3807,3808,3811,3812,3807,3815,807],{},"These two questions -",[1231,3805,3806],{},"\"is this real?\""," and ",[1231,3809,3810],{},"\"who gets paid?\""," -sit at the heart of the music industry's biggest challenges today. Two very different standards are stepping up to answer them: ",[1231,3813,3814],{},"C2PA",[1231,3816,3817],{},"DDEX",[752,3819,3821],{"id":3820},"what-is-c2pa","What is C2PA?",[748,3823,3824],{},"C2PA (Coalition for Content Provenance and Authenticity) is an open standard for proving the origin and history of digital content. Think of it as a tamper-proof seal for media files: images, video, audio, and documents.",[834,3826,3828],{"id":3827},"how-it-works","How it works",[748,3830,3831],{},"The standard operates through three core mechanisms:",[760,3833,3835,3840,3845],{"className":3834},[763,764,2324,766,767],[769,3836],{"description":3837,"icon":3838,"title":3839},"Cryptographically signed metadata embedded in files. They record who created or edited the content, what tools were used, and when the changes happened.","i-lucide-fingerprint","Content Credentials",[769,3841],{"description":3842,"icon":3843,"title":3844},"Structured metadata containers attached to content. Each manifest holds assertions (claims about the content) and a digital signature that can be verified against a certificate chain.","i-lucide-file-check","Manifests",[769,3846],{"description":3847,"icon":3848,"title":3849},"Cryptographic ties between the manifest and the actual content bytes. If someone tampers with the file, the binding breaks and verification fails.","i-lucide-link","Hard Bindings",[748,3851,3852,3853,3856],{},"Every time content is created or edited, a new manifest entry is added, forming a ",[1231,3854,3855],{},"provenance chain",". A camera captures an image and signs it. An editor crops it and adds a new signed manifest. An AI model generates a track and labels it as AI-created. Each step is recorded and verifiable.",[812,3858,3859],{},[748,3860,3861,3862,3867],{},"C2PA was ",[828,3863,3866],{"href":3864,"rel":3865},"https://c2pa.org/about/",[1276],"founded by Adobe, Arm, Intel, Microsoft, and Truepic"," as a Joint Development Foundation project. It unifies two earlier initiatives: the Adobe-led Content Authenticity Initiative (CAI) and Project Origin, a Microsoft- and BBC-led effort tackling disinformation in digital news. The coalition has since grown to include Sony, Nikon, Google, OpenAI, and many others.",[834,3869,3871],{"id":3870},"c2pa-for-audio","C2PA for audio",[748,3873,3874],{},"While C2PA gained traction in the image and video space first, audio support is growing. The spec already supports audio file formats, and the implications for music are significant:",[1225,3876,3877,3891,3897],{},[1228,3878,3879,3882,3883,3886,3887,3890],{},[1231,3880,3881],{},"AI transparency"," -a generative model like Suno or Udio could embed a C2PA manifest with a ",[800,3884,3885],{},"digitalSourceType"," (defined by IPTC) of ",[800,3888,3889],{},"trainedAlgorithmicMedia",", the standard way to declare content as AI-generated. Additional assertions can capture model details and prompts",[1228,3892,3893,3896],{},[1231,3894,3895],{},"Recording provenance"," -a DAW or recording device could sign audio at the point of capture, creating a verifiable chain from microphone to master. We are just starting to see reference implementations where stems -with or without provenance -can be mixed into a final and saved with provenance that includes ingredients, but these are demos and PoCs. No DAW has committed to shipping C2PA support yet",[1228,3898,3899,3902],{},[1231,3900,3901],{},"Remix and sample tracking"," -each derivative work adds a manifest, linking back to source material",[752,3904,3906],{"id":3905},"what-is-ddex","What is DDEX?",[748,3908,3909],{},"DDEX (Digital Data Exchange) is a group of music industry players that builds standards for sharing data about music. While C2PA asks \"is this content real?\", DDEX asks \"who owns this, and how should they be paid?\"",[834,3911,3913],{"id":3912},"the-ddex-standard-family","The DDEX standard family",[748,3915,3916],{},"DDEX isn't a single standard -it's a family of XML and JSON-based messaging formats:",[1122,3918,3919,3929],{},[1125,3920,3921],{},[1128,3922,3923,3926],{},[1131,3924,3925],{},"Standard",[1131,3927,3928],{},"Purpose",[1138,3930,3931,3942,3953,3964,3975],{},[1128,3932,3933,3939],{},[1143,3934,3935,3938],{},[1231,3936,3937],{},"ERN"," (Electronic Release Notification)",[1143,3940,3941],{},"Delivering releases from labels to DSPs",[1128,3943,3944,3950],{},[1143,3945,3946,3949],{},[1231,3947,3948],{},"MWN"," (Musical Works Notification)",[1143,3951,3952],{},"Communicating musical works data between publishers and societies",[1128,3954,3955,3961],{},[1143,3956,3957,3960],{},[1231,3958,3959],{},"MEAD"," (Media Enrichment and Description)",[1143,3962,3963],{},"Enriching metadata for discovery and curation",[1128,3965,3966,3972],{},[1143,3967,3968,3971],{},[1231,3969,3970],{},"DSR"," (Digital Sales Reporting)",[1143,3973,3974],{},"Reporting sales and streams back to rights holders",[1128,3976,3977,3983],{},[1143,3978,3979,3982],{},[1231,3980,3981],{},"RDR"," (Recording Data and Rights)",[1143,3984,3985],{},"Linking sound recordings to musical works and their rights holders",[1254,3987,3988],{},[748,3989,3990],{},"If you distribute music to Spotify, Apple Music, Amazon, or any major DSP, your distributor is almost certainly using DDEX ERN messages under the hood.",[834,3992,3994],{"id":3993},"what-ddex-carries","What DDEX carries",[748,3996,3997],{},"A DDEX message typically contains:",[1225,3999,4000,4006,4012,4018,4024],{},[1228,4001,4002,4005],{},[1231,4003,4004],{},"Release metadata"," -title, artist, label, UPC/EAN, genre, release date",[1228,4007,4008,4011],{},[1231,4009,4010],{},"Track-level data"," -ISRC codes, duration, contributors, territories",[1228,4013,4014,4017],{},[1231,4015,4016],{},"Rights and licensing"," -who owns what, in which territories, under which terms",[1228,4019,4020,4023],{},[1231,4021,4022],{},"Commercial terms"," -pricing, availability windows, pre-order dates",[1228,4025,4026,4029],{},[1231,4027,4028],{},"Royalty reporting"," -stream counts, revenue splits, payment details",[748,4031,4032,4033,4036],{},"In practice, this metadata arrives from every distributor in different formats and naming conventions. Even something as simple as a retailer name can appear ",[828,4034,4035],{"href":81},"830 different ways across sources",", which is why normalisation is a critical step before any of this data becomes useful.",[752,4038,4040],{"id":4039},"who-are-these-standards-designed-for","Who are these standards designed for?",[760,4042,4044,4127],{"className":4043},[763,764,765,766,767],[769,4045,4049],{"description":4046,"icon":4047,"title":4048},"Anyone who creates, distributes, or consumes digital content.","i-lucide-building-2","C2PA -Who benefits",[1122,4050,4051,4061],{},[1125,4052,4053],{},[1128,4054,4055,4058],{},[1131,4056,4057],{},"Stakeholder",[1131,4059,4060],{},"How they use C2PA",[1138,4062,4063,4074,4085,4096,4106,4116],{},[1128,4064,4065,4071],{},[1143,4066,4067,4070],{},[1231,4068,4069],{},"DAW vendors"," (Ableton, Logic, Pro Tools)",[1143,4072,4073],{},"Sign audio at export to prove origin",[1128,4075,4076,4082],{},[1143,4077,4078,4081],{},[1231,4079,4080],{},"AI music platforms"," (Suno, Udio)",[1143,4083,4084],{},"Label outputs as AI-generated with model details",[1128,4086,4087,4093],{},[1143,4088,4089,4092],{},[1231,4090,4091],{},"Streaming platforms"," (Spotify, Apple Music)",[1143,4094,4095],{},"Verify content authenticity at ingest",[1128,4097,4098,4103],{},[1143,4099,4100],{},[1231,4101,4102],{},"News organizations",[1143,4104,4105],{},"Confirm audio/video hasn't been manipulated",[1128,4107,4108,4113],{},[1143,4109,4110],{},[1231,4111,4112],{},"Creators and artists",[1143,4114,4115],{},"Prove their work is original and human-made",[1128,4117,4118,4124],{},[1143,4119,4120,4123],{},[1231,4121,4122],{},"Hardware manufacturers"," (Nikon, Sony)",[1143,4125,4126],{},"Embed provenance at point of capture",[769,4128,4131],{"description":4129,"icon":2333,"title":4130},"Music industry players who need to exchange rights and commercial data.","DDEX -Who benefits",[1122,4132,4133,4142],{},[1125,4134,4135],{},[1128,4136,4137,4139],{},[1131,4138,4057],{},[1131,4140,4141],{},"How they use DDEX",[1138,4143,4144,4154,4165,4176,4186,4197],{},[1128,4145,4146,4151],{},[1143,4147,4148],{},[1231,4149,4150],{},"Record labels",[1143,4152,4153],{},"Deliver releases and metadata to DSPs",[1128,4155,4156,4162],{},[1143,4157,4158,4161],{},[1231,4159,4160],{},"Distributors"," (DistroKid, TuneCore)",[1143,4163,4164],{},"Automate release delivery via ERN messages",[1128,4166,4167,4173],{},[1143,4168,4169,4172],{},[1231,4170,4171],{},"DSPs"," (Spotify, Apple Music, Amazon)",[1143,4174,4175],{},"Ingest releases with structured rights data",[1128,4177,4178,4183],{},[1143,4179,4180],{},[1231,4181,4182],{},"Publishers",[1143,4184,4185],{},"Communicate musical works ownership via MWN",[1128,4187,4188,4194],{},[1143,4189,4190,4193],{},[1231,4191,4192],{},"Collecting societies"," (ASCAP, PRS, ZAIKS)",[1143,4195,4196],{},"Process royalty claims and distributions",[1128,4198,4199,4204],{},[1143,4200,4201],{},[1231,4202,4203],{},"Independent artists",[1143,4205,4206],{},"Get paid correctly through standardized reporting",[752,4208,4210],{"id":4209},"the-fundamental-difference","The fundamental difference",[748,4212,4213],{},"Here's the core distinction:",[760,4215,4217,4239],{"className":4216},[763,764,765,766,767],[769,4218,4222],{"description":4219,"icon":4220,"title":4221},"Was this content tampered with? Who created it? Was AI involved?","i-lucide-shield-check","C2PA -Trust Layer",[1225,4223,4224,4227,4230,4233,4236],{},[1228,4225,4226],{},"Cryptographic proof of origin",[1228,4228,4229],{},"Tamper-evident edit history",[1228,4231,4232],{},"AI disclosure and labeling",[1228,4234,4235],{},"Works on any digital media",[1228,4237,4238],{},"PKI-based trust model (see below)",[769,4240,4244],{"description":4241,"icon":4242,"title":4243},"Who owns the rights? How should royalties be split? Where can this be distributed?","i-lucide-receipt","DDEX -Commerce Layer",[1225,4245,4246,4249,4252,4255,4258],{},[1228,4247,4248],{},"Rights ownership and splits",[1228,4250,4251],{},"Commercial metadata exchange",[1228,4253,4254],{},"Royalty reporting and payment",[1228,4256,4257],{},"Music industry specific",[1228,4259,4260],{},"B2B contractual trust model",[834,4262,4264],{"id":4263},"how-c2pa-trust-works-pki-in-plain-terms","How C2PA trust works: PKI in plain terms",[748,4266,4267,4268,4271],{},"C2PA relies on ",[1231,4269,4270],{},"Public Key Infrastructure (PKI)",", the same trust system that secures HTTPS websites. Every app or device that creates content holds a private key and a certificate from a trusted authority. When a C2PA manifest is signed, anyone can check that signature against the certificate chain, up to a root Certificate Authority (CA). If it checks out, you know the manifest is untouched and you know who produced it. Change even a single byte of the file, and the signature breaks.",[748,4273,4274],{},"In practice, this means a DAW vendor like Ableton could obtain a C2PA certificate, sign every exported master, and any platform receiving that file can verify it came from Ableton's software, untouched.",[748,4276,4277,4278,4281,4282,4285],{},"They operate at different layers of the content lifecycle. C2PA is about the ",[1231,4279,4280],{},"integrity of the content itself"," -its provenance and authenticity. DDEX is about the ",[1231,4283,4284],{},"business logic surrounding the content"," -ownership, distribution, and compensation.",[752,4287,4289],{"id":4288},"why-ai-music-needs-both","Why AI music needs both",[748,4291,4292],{},"The rise of AI-generated music is exactly why both standards matter now.",[834,4294,4296],{"id":4295},"the-authenticity-problem","The authenticity problem",[748,4298,4299],{},"When an AI model can generate a track that sounds identical to a human recording, platforms, listeners, and rights holders all need to know the origin. Without C2PA-style provenance:",[1225,4301,4302,4305,4308],{},[1228,4303,4304],{},"A generated track could be uploaded as an \"original recording\" and claim royalties under false pretenses",[1228,4306,4307],{},"Training data attribution becomes impossible to verify",[1228,4309,4310],{},"Deepfake audio of real artists erodes trust across the entire ecosystem",[834,4312,4314],{"id":4313},"the-rights-problem","The rights problem",[748,4316,4317],{},"Even when AI origin is disclosed, the rights questions are hard:",[1225,4319,4320,4323,4326],{},[1228,4321,4322],{},"Who owns an AI-generated track -the prompter, the model operator, or the training data contributors?",[1228,4324,4325],{},"If a model was trained on copyrighted recordings, how should those rights holders be compensated?",[1228,4327,4328],{},"How do existing DDEX workflows handle a \"performer\" that is a language model?",[4330,4331,4332],"warning",{},[748,4333,4334,4335,3219,4337,4339,4340,4343],{},"Current DDEX schemas weren't built for AI-generated content. Fields like ",[800,4336,1614],{},[800,4338,1617],{},", and ",[800,4341,4342],{},"Contributor"," assume human creators. The industry will need to extend these standards, or build new ones, to handle AI provenance and attribution.",[834,4345,4347],{"id":4346},"the-combined-solution","The combined solution",[748,4349,4350],{},"Imagine a future where a single music file carries both layers:",[760,4352,4354,4411],{"className":4353},[763,764,765,766,767],[769,4355,4358],{"description":4356,"icon":4220,"title":4357},"Authenticity and provenance layer embedded in the file.","C2PA Manifest",[1122,4359,4360,4368],{},[1125,4361,4362],{},[1128,4363,4364,4366],{},[1131,4365,1590],{},[1131,4367,2910],{},[1138,4369,4370,4378,4387,4395,4403],{},[1128,4371,4372,4375],{},[1143,4373,4374],{},"Created by",[1143,4376,4377],{},"SunoAI v4.0",[1128,4379,4380,4382],{},[1143,4381,3885],{},[1143,4383,4384,4386],{},[800,4385,3889],{}," (IPTC)",[1128,4388,4389,4392],{},[1143,4390,4391],{},"Prompt",[1143,4393,4394],{},"\"upbeat jazz fusion, 120 BPM\"",[1128,4396,4397,4400],{},[1143,4398,4399],{},"Training data",[1143,4401,4402],{},"Licensed Dataset X",[1128,4404,4405,4408],{},[1143,4406,4407],{},"Signature",[1143,4409,4410],{},"Valid (SunoAI cert)",[769,4412,4415],{"description":4413,"icon":4242,"title":4414},"Commercial and rights layer for distribution and payment.","DDEX Metadata",[1122,4416,4417,4425],{},[1125,4418,4419],{},[1128,4420,4421,4423],{},[1131,4422,1590],{},[1131,4424,2910],{},[1138,4426,4427,4434,4442,4450,4458],{},[1128,4428,4429,4431],{},[1143,4430,1469],{},[1143,4432,4433],{},"USXX42312345",[1128,4435,4436,4439],{},[1143,4437,4438],{},"Rights holder",[1143,4440,4441],{},"Acme Music LLC",[1128,4443,4444,4447],{},[1143,4445,4446],{},"Royalty split",[1143,4448,4449],{},"70% publisher / 30% AI",[1128,4451,4452,4455],{},[1143,4453,4454],{},"Territory",[1143,4456,4457],{},"Worldwide",[1128,4459,4460,4463],{},[1143,4461,4462],{},"Distributor",[1143,4464,4465],{},"DistroKid",[748,4467,4468,4469,4472,4473,4476],{},"The C2PA layer provides ",[1231,4470,4471],{},"verifiable proof"," of how the content was created. The DDEX layer provides ",[1231,4474,4475],{},"the commercial framework"," for distributing it and paying the right parties.",[752,4478,4480],{"id":4479},"technical-integration-points","Technical integration points",[748,4482,4483],{},"For developers and music tech teams thinking about implementation, here are the key integration points:",[760,4485,4487,4529,4586],{"className":4486},[763,764,2324,766,767],[769,4488,4491],{"description":4489,"icon":1538,"title":4490},"When a track arrives at a DSP or distributor, run these checks in sequence.","Ingest Pipeline",[1122,4492,4493,4503],{},[1125,4494,4495],{},[1128,4496,4497,4500],{},[1131,4498,4499],{},"Step",[1131,4501,4502],{},"Action",[1138,4504,4505,4513,4521],{},[1128,4506,4507,4510],{},[1143,4508,4509],{},"Validate C2PA",[1143,4511,4512],{},"Check signature chain, verify content integrity, extract provenance",[1128,4514,4515,4518],{},[1143,4516,4517],{},"Parse DDEX",[1143,4519,4520],{},"Extract rights, contributors, and commercial terms",[1128,4522,4523,4526],{},[1143,4524,4525],{},"Cross-reference",[1143,4527,4528],{},"Flag mismatches (e.g. C2PA says \"AI-generated\" but DDEX lists a human performer)",[769,4530,4534],{"description":4531,"icon":4532,"title":4533},"C2PA provenance data can automatically populate DDEX fields.","i-lucide-merge","Metadata Enrichment",[1122,4535,4536,4546],{},[1125,4537,4538],{},[1128,4539,4540,4543],{},[1131,4541,4542],{},"C2PA Source",[1131,4544,4545],{},"DDEX Target",[1138,4547,4548,4563,4572],{},[1128,4549,4550,4555],{},[1143,4551,4552],{},[800,4553,4554],{},"creator",[1143,4556,4557,4560,4561],{},[800,4558,4559],{},"DisplayArtist"," / ",[800,4562,4342],{},[1128,4564,4565,4569],{},[1143,4566,4567],{},[800,4568,3885],{},[1143,4570,4571],{},"Extension field for AI disclosure",[1128,4573,4574,4580],{},[1143,4575,4576,4579],{},[800,4577,4578],{},"source material"," refs",[1143,4581,4582,4585],{},[800,4583,4584],{},"RelatedRelease"," links",[769,4587,4591],{"description":4588,"icon":4589,"title":4590},"Before distributing a track, a platform should verify both layers.","i-lucide-check-circle","Rights Verification",[1122,4592,4593,4602],{},[1125,4594,4595],{},[1128,4596,4597,4600],{},[1131,4598,4599],{},"Check",[1131,4601,3928],{},[1138,4603,4604,4612,4620],{},[1128,4605,4606,4609],{},[1143,4607,4608],{},"C2PA chain",[1143,4610,4611],{},"Confirm submitter has legitimate access to the content",[1128,4613,4614,4617],{},[1143,4615,4616],{},"DDEX rights",[1143,4618,4619],{},"Confirm distribution is authorized for the target territory",[1128,4621,4622,4625],{},[1143,4623,4624],{},"Training data refs",[1143,4626,4627],{},"Verify licensing compliance for AI-generated content",[752,4629,4631],{"id":4630},"whats-happening-now","What's happening now",[748,4633,4634],{},"Both standards are actively evolving:",[748,4636,4637,4639,4640,4643],{},[1231,4638,3814],{}," released version 2.3 of the specification and the ecosystem is growing rapidly. The ",[800,4641,4642],{},"c2patool"," CLI and libraries in Rust, JavaScript, and Python make it possible to read and write C2PA manifests programmatically, though writing manifests correctly is non-trivial in practice.",[748,4645,4646,4648],{},[1231,4647,3817],{}," continues to refine its standards. ERN 4.3 is the latest release notification format, and there are ongoing discussions within the consortium about how to handle AI-generated content within existing schemas.",[812,4650,4651],{},[748,4652,4653,4654,4656,4657,4662,4663,4665],{},"The C2PA spec requires every asset to include a ",[800,4655,3885],{}," as defined by ",[828,4658,4661],{"href":4659,"rel":4660},"https://iptc.org/",[1276],"IPTC",". For AI-generated content, the value is ",[800,4664,3889],{},". There are additional assertions available for AI content, but in practice consumption and verification tooling is still catching up -much of this remains theoretical for now.",[1254,4667,4668],{},[748,4669,4670,4671,4676,4677,4682],{},"If you're building music tech infrastructure, start experimenting with C2PA now. The ",[828,4672,4675],{"href":4673,"rel":4674},"https://github.com/contentauth/c2pa-rs",[1276],"c2pa-rs"," Rust crate and ",[828,4678,4681],{"href":4679,"rel":4680},"https://github.com/contentauth/c2pa-node",[1276],"c2pa-node"," JavaScript library are production-ready and well-documented. You can get quite far using the development certificate for testing.",[752,4684,4686],{"id":4685},"code-examples","Code examples",[834,4688,4690],{"id":4689},"reading-a-c2pa-manifest-with-python","Reading a C2PA manifest with Python",[748,4692,4693,4694,4697],{},"The ",[800,4695,4696],{},"c2pa-python"," library lets you read and validate Content Credentials from any supported file:",[862,4699,4704],{"className":4700,"code":4701,"filename":4702,"language":4703,"meta":867,"style":867},"language-python shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import c2pa\n\n# Read the C2PA manifest from an audio file\nreader = c2pa.Reader.from_file(\"track.wav\")\n\n# Get the active manifest (most recent signer)\nmanifest = reader.get_active_manifest()\n\nprint(f\"Title: {manifest['title']}\")\nprint(f\"Format: {manifest['format']}\")\n\n# Check assertions -was this AI-generated?\nfor assertion in manifest.get(\"assertions\", []):\n    if assertion[\"label\"] == \"c2pa.actions\":\n        for action in assertion[\"data\"][\"actions\"]:\n            print(f\"Action: {action['action']}\")\n            if \"softwareAgent\" in action:\n                print(f\"Software: {action['softwareAgent']}\")\n            # digitalSourceType is required by the spec (IPTC vocabulary)\n            # trainedAlgorithmicMedia = AI-generated content\n            if \"digitalSourceType\" in action:\n                print(f\"Source type: {action['digitalSourceType']}\")\n\n# Validate the signature chain\nvalidation = reader.validation_status\nif not validation:\n    print(\"Signature: VALID\")\nelse:\n    for status in validation:\n        print(f\"Issue: {status['code']}\")\n","read_c2pa.py","python",[800,4705,4706,4715,4719,4725,4760,4764,4769,4787,4791,4830,4861,4865,4870,4903,4935,4969,5002,5022,5054,5059,5064,5080,5111,5115,5120,5134,5147,5163,5170,5184],{"__ignoreMap":867},[871,4707,4708,4712],{"class":873,"line":874},[871,4709,4711],{"class":4710},"s7zQu","import",[871,4713,4714],{"class":877}," c2pa\n",[871,4716,4717],{"class":873,"line":881},[871,4718,927],{"emptyLinePlaceholder":926},[871,4720,4721],{"class":873,"line":887},[871,4722,4724],{"class":4723},"sHwdD","# Read the C2PA manifest from an audio file\n",[871,4726,4727,4730,4733,4736,4738,4742,4744,4747,4750,4752,4755,4757],{"class":873,"line":893},[871,4728,4729],{"class":877},"reader ",[871,4731,4732],{"class":1699},"=",[871,4734,4735],{"class":877}," c2pa",[871,4737,807],{"class":1699},[871,4739,4741],{"class":4740},"swJcz","Reader",[871,4743,807],{"class":1699},[871,4745,4746],{"class":2373},"from_file",[871,4748,4749],{"class":1699},"(",[871,4751,1712],{"class":1699},[871,4753,4754],{"class":1721},"track.wav",[871,4756,1712],{"class":1699},[871,4758,4759],{"class":1699},")\n",[871,4761,4762],{"class":873,"line":899},[871,4763,927],{"emptyLinePlaceholder":926},[871,4765,4766],{"class":873,"line":905},[871,4767,4768],{"class":4723},"# Get the active manifest (most recent signer)\n",[871,4770,4771,4774,4776,4779,4781,4784],{"class":873,"line":911},[871,4772,4773],{"class":877},"manifest ",[871,4775,4732],{"class":1699},[871,4777,4778],{"class":877}," reader",[871,4780,807],{"class":1699},[871,4782,4783],{"class":2373},"get_active_manifest",[871,4785,4786],{"class":1699},"()\n",[871,4788,4789],{"class":873,"line":917},[871,4790,927],{"emptyLinePlaceholder":926},[871,4792,4793,4796,4798,4801,4804,4807,4810,4813,4816,4818,4820,4823,4826,4828],{"class":873,"line":923},[871,4794,4795],{"class":2373},"print",[871,4797,4749],{"class":1699},[871,4799,4800],{"class":1708},"f",[871,4802,4803],{"class":1721},"\"Title: ",[871,4805,4806],{"class":1761},"{",[871,4808,4809],{"class":2373},"manifest",[871,4811,4812],{"class":1699},"[",[871,4814,4815],{"class":1699},"'",[871,4817,1834],{"class":1721},[871,4819,4815],{"class":1699},[871,4821,4822],{"class":1699},"]",[871,4824,4825],{"class":1761},"}",[871,4827,1712],{"class":1721},[871,4829,4759],{"class":1699},[871,4831,4832,4834,4836,4838,4841,4843,4845,4847,4849,4851,4853,4855,4857,4859],{"class":873,"line":930},[871,4833,4795],{"class":2373},[871,4835,4749],{"class":1699},[871,4837,4800],{"class":1708},[871,4839,4840],{"class":1721},"\"Format: ",[871,4842,4806],{"class":1761},[871,4844,4809],{"class":2373},[871,4846,4812],{"class":1699},[871,4848,4815],{"class":1699},[871,4850,1734],{"class":1721},[871,4852,4815],{"class":1699},[871,4854,4822],{"class":1699},[871,4856,4825],{"class":1761},[871,4858,1712],{"class":1721},[871,4860,4759],{"class":1699},[871,4862,4863],{"class":873,"line":936},[871,4864,927],{"emptyLinePlaceholder":926},[871,4866,4867],{"class":873,"line":942},[871,4868,4869],{"class":4723},"# Check assertions -was this AI-generated?\n",[871,4871,4872,4875,4878,4881,4884,4886,4889,4891,4893,4896,4898,4900],{"class":873,"line":948},[871,4873,4874],{"class":4710},"for",[871,4876,4877],{"class":877}," assertion ",[871,4879,4880],{"class":4710},"in",[871,4882,4883],{"class":877}," manifest",[871,4885,807],{"class":1699},[871,4887,4888],{"class":2373},"get",[871,4890,4749],{"class":1699},[871,4892,1712],{"class":1699},[871,4894,4895],{"class":1721},"assertions",[871,4897,1712],{"class":1699},[871,4899,2061],{"class":1699},[871,4901,4902],{"class":1699}," []):\n",[871,4904,4905,4908,4911,4913,4915,4918,4920,4922,4925,4927,4930,4932],{"class":873,"line":954},[871,4906,4907],{"class":4710},"    if",[871,4909,4910],{"class":877}," assertion",[871,4912,4812],{"class":1699},[871,4914,1712],{"class":1699},[871,4916,4917],{"class":1721},"label",[871,4919,1712],{"class":1699},[871,4921,4822],{"class":1699},[871,4923,4924],{"class":1699}," ==",[871,4926,1718],{"class":1699},[871,4928,4929],{"class":1721},"c2pa.actions",[871,4931,1712],{"class":1699},[871,4933,4934],{"class":1699},":\n",[871,4936,4937,4940,4943,4945,4947,4949,4951,4954,4956,4959,4961,4964,4966],{"class":873,"line":960},[871,4938,4939],{"class":4710},"        for",[871,4941,4942],{"class":877}," action ",[871,4944,4880],{"class":4710},[871,4946,4910],{"class":877},[871,4948,4812],{"class":1699},[871,4950,1712],{"class":1699},[871,4952,4953],{"class":1721},"data",[871,4955,1712],{"class":1699},[871,4957,4958],{"class":1699},"][",[871,4960,1712],{"class":1699},[871,4962,4963],{"class":1721},"actions",[871,4965,1712],{"class":1699},[871,4967,4968],{"class":1699},"]:\n",[871,4970,4971,4974,4976,4978,4981,4983,4986,4988,4990,4992,4994,4996,4998,5000],{"class":873,"line":966},[871,4972,4973],{"class":2373},"            print",[871,4975,4749],{"class":1699},[871,4977,4800],{"class":1708},[871,4979,4980],{"class":1721},"\"Action: ",[871,4982,4806],{"class":1761},[871,4984,4985],{"class":2373},"action",[871,4987,4812],{"class":1699},[871,4989,4815],{"class":1699},[871,4991,4985],{"class":1721},[871,4993,4815],{"class":1699},[871,4995,4822],{"class":1699},[871,4997,4825],{"class":1761},[871,4999,1712],{"class":1721},[871,5001,4759],{"class":1699},[871,5003,5004,5007,5009,5012,5014,5017,5020],{"class":873,"line":972},[871,5005,5006],{"class":4710},"            if",[871,5008,1718],{"class":1699},[871,5010,5011],{"class":1721},"softwareAgent",[871,5013,1712],{"class":1699},[871,5015,5016],{"class":1699}," in",[871,5018,5019],{"class":877}," action",[871,5021,4934],{"class":1699},[871,5023,5024,5027,5029,5031,5034,5036,5038,5040,5042,5044,5046,5048,5050,5052],{"class":873,"line":978},[871,5025,5026],{"class":2373},"                print",[871,5028,4749],{"class":1699},[871,5030,4800],{"class":1708},[871,5032,5033],{"class":1721},"\"Software: ",[871,5035,4806],{"class":1761},[871,5037,4985],{"class":2373},[871,5039,4812],{"class":1699},[871,5041,4815],{"class":1699},[871,5043,5011],{"class":1721},[871,5045,4815],{"class":1699},[871,5047,4822],{"class":1699},[871,5049,4825],{"class":1761},[871,5051,1712],{"class":1721},[871,5053,4759],{"class":1699},[871,5055,5056],{"class":873,"line":983},[871,5057,5058],{"class":4723},"            # digitalSourceType is required by the spec (IPTC vocabulary)\n",[871,5060,5061],{"class":873,"line":989},[871,5062,5063],{"class":4723},"            # trainedAlgorithmicMedia = AI-generated content\n",[871,5065,5066,5068,5070,5072,5074,5076,5078],{"class":873,"line":995},[871,5067,5006],{"class":4710},[871,5069,1718],{"class":1699},[871,5071,3885],{"class":1721},[871,5073,1712],{"class":1699},[871,5075,5016],{"class":1699},[871,5077,5019],{"class":877},[871,5079,4934],{"class":1699},[871,5081,5082,5084,5086,5088,5091,5093,5095,5097,5099,5101,5103,5105,5107,5109],{"class":873,"line":1001},[871,5083,5026],{"class":2373},[871,5085,4749],{"class":1699},[871,5087,4800],{"class":1708},[871,5089,5090],{"class":1721},"\"Source type: ",[871,5092,4806],{"class":1761},[871,5094,4985],{"class":2373},[871,5096,4812],{"class":1699},[871,5098,4815],{"class":1699},[871,5100,3885],{"class":1721},[871,5102,4815],{"class":1699},[871,5104,4822],{"class":1699},[871,5106,4825],{"class":1761},[871,5108,1712],{"class":1721},[871,5110,4759],{"class":1699},[871,5112,5113],{"class":873,"line":1006},[871,5114,927],{"emptyLinePlaceholder":926},[871,5116,5117],{"class":873,"line":1012},[871,5118,5119],{"class":4723},"# Validate the signature chain\n",[871,5121,5122,5125,5127,5129,5131],{"class":873,"line":1018},[871,5123,5124],{"class":877},"validation ",[871,5126,4732],{"class":1699},[871,5128,4778],{"class":877},[871,5130,807],{"class":1699},[871,5132,5133],{"class":4740},"validation_status\n",[871,5135,5136,5139,5142,5145],{"class":873,"line":1024},[871,5137,5138],{"class":4710},"if",[871,5140,5141],{"class":1699}," not",[871,5143,5144],{"class":877}," validation",[871,5146,4934],{"class":1699},[871,5148,5149,5152,5154,5156,5159,5161],{"class":873,"line":1030},[871,5150,5151],{"class":2373},"    print",[871,5153,4749],{"class":1699},[871,5155,1712],{"class":1699},[871,5157,5158],{"class":1721},"Signature: VALID",[871,5160,1712],{"class":1699},[871,5162,4759],{"class":1699},[871,5164,5165,5168],{"class":873,"line":1036},[871,5166,5167],{"class":4710},"else",[871,5169,4934],{"class":1699},[871,5171,5172,5175,5178,5180,5182],{"class":873,"line":1042},[871,5173,5174],{"class":4710},"    for",[871,5176,5177],{"class":877}," status ",[871,5179,4880],{"class":4710},[871,5181,5144],{"class":877},[871,5183,4934],{"class":1699},[871,5185,5186,5189,5191,5193,5196,5198,5201,5203,5205,5207,5209,5211,5213,5215],{"class":873,"line":1048},[871,5187,5188],{"class":2373},"        print",[871,5190,4749],{"class":1699},[871,5192,4800],{"class":1708},[871,5194,5195],{"class":1721},"\"Issue: ",[871,5197,4806],{"class":1761},[871,5199,5200],{"class":2373},"status",[871,5202,4812],{"class":1699},[871,5204,4815],{"class":1699},[871,5206,800],{"class":1721},[871,5208,4815],{"class":1699},[871,5210,4822],{"class":1699},[871,5212,4825],{"class":1761},[871,5214,1712],{"class":1721},[871,5216,4759],{"class":1699},[834,5218,5220],{"id":5219},"ddex-ern-message-simplified","DDEX ERN message (simplified)",[748,5222,5223,5224,5227,5228,5231,5232,5235],{},"The core of a DDEX Electronic Release Notification boils down to three blocks: ",[1231,5225,5226],{},"what"," is being released, ",[1231,5229,5230],{},"who"," performs it, and ",[1231,5233,5234],{},"where/how"," it can be streamed:",[862,5237,5242],{"className":5238,"code":5239,"filename":5240,"language":5241,"meta":867,"style":867},"language-xml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u003CNewReleaseMessage>\n  \u003C!-- WHAT: the release -->\n  \u003CRelease>\n    \u003CICPN>0123456789012\u003C/ICPN>\n    \u003CTitle>Upbeat Jazz Fusion\u003C/Title>\n    \u003CArtist>Acme Music AI\u003C/Artist>\n    \u003CTerritory>Worldwide\u003C/Territory>\n  \u003C/Release>\n\n  \u003C!-- WHO: the sound recording -->\n  \u003CSoundRecording>\n    \u003CISRC>USXX42312345\u003C/ISRC>\n    \u003CDuration>PT3M24S\u003C/Duration>\n    \u003CArtistRole>MainArtist\u003C/ArtistRole>  \u003C!-- No \"AI\" option here -->\n  \u003C/SoundRecording>\n\n  \u003C!-- HOW: the deal terms -->\n  \u003CDeal>\n    \u003CModel>SubscriptionModel\u003C/Model>\n    \u003CUseType>OnDemandStream\u003C/UseType>\n    \u003CStartDate>2026-03-13\u003C/StartDate>\n  \u003C/Deal>\n\u003C/NewReleaseMessage>\n","ern_release.xml","xml",[800,5243,5244,5255,5260,5270,5291,5308,5325,5341,5350,5354,5359,5368,5384,5402,5423,5431,5435,5440,5449,5467,5485,5503,5511],{"__ignoreMap":867},[871,5245,5246,5249,5252],{"class":873,"line":874},[871,5247,5248],{"class":1699},"\u003C",[871,5250,5251],{"class":4740},"NewReleaseMessage",[871,5253,5254],{"class":1699},">\n",[871,5256,5257],{"class":873,"line":881},[871,5258,5259],{"class":4723},"  \u003C!-- WHAT: the release -->\n",[871,5261,5262,5265,5268],{"class":873,"line":887},[871,5263,5264],{"class":1699},"  \u003C",[871,5266,5267],{"class":4740},"Release",[871,5269,5254],{"class":1699},[871,5271,5272,5275,5278,5281,5284,5287,5289],{"class":873,"line":893},[871,5273,5274],{"class":1699},"    \u003C",[871,5276,5277],{"class":4740},"ICPN",[871,5279,5280],{"class":1699},">",[871,5282,5283],{"class":877},"0123456789012",[871,5285,5286],{"class":1699},"\u003C/",[871,5288,5277],{"class":4740},[871,5290,5254],{"class":1699},[871,5292,5293,5295,5297,5299,5302,5304,5306],{"class":873,"line":899},[871,5294,5274],{"class":1699},[871,5296,1603],{"class":4740},[871,5298,5280],{"class":1699},[871,5300,5301],{"class":877},"Upbeat Jazz Fusion",[871,5303,5286],{"class":1699},[871,5305,1603],{"class":4740},[871,5307,5254],{"class":1699},[871,5309,5310,5312,5314,5316,5319,5321,5323],{"class":873,"line":905},[871,5311,5274],{"class":1699},[871,5313,1614],{"class":4740},[871,5315,5280],{"class":1699},[871,5317,5318],{"class":877},"Acme Music AI",[871,5320,5286],{"class":1699},[871,5322,1614],{"class":4740},[871,5324,5254],{"class":1699},[871,5326,5327,5329,5331,5333,5335,5337,5339],{"class":873,"line":911},[871,5328,5274],{"class":1699},[871,5330,4454],{"class":4740},[871,5332,5280],{"class":1699},[871,5334,4457],{"class":877},[871,5336,5286],{"class":1699},[871,5338,4454],{"class":4740},[871,5340,5254],{"class":1699},[871,5342,5343,5346,5348],{"class":873,"line":917},[871,5344,5345],{"class":1699},"  \u003C/",[871,5347,5267],{"class":4740},[871,5349,5254],{"class":1699},[871,5351,5352],{"class":873,"line":923},[871,5353,927],{"emptyLinePlaceholder":926},[871,5355,5356],{"class":873,"line":930},[871,5357,5358],{"class":4723},"  \u003C!-- WHO: the sound recording -->\n",[871,5360,5361,5363,5366],{"class":873,"line":936},[871,5362,5264],{"class":1699},[871,5364,5365],{"class":4740},"SoundRecording",[871,5367,5254],{"class":1699},[871,5369,5370,5372,5374,5376,5378,5380,5382],{"class":873,"line":942},[871,5371,5274],{"class":1699},[871,5373,1469],{"class":4740},[871,5375,5280],{"class":1699},[871,5377,4433],{"class":877},[871,5379,5286],{"class":1699},[871,5381,1469],{"class":4740},[871,5383,5254],{"class":1699},[871,5385,5386,5388,5391,5393,5396,5398,5400],{"class":873,"line":948},[871,5387,5274],{"class":1699},[871,5389,5390],{"class":4740},"Duration",[871,5392,5280],{"class":1699},[871,5394,5395],{"class":877},"PT3M24S",[871,5397,5286],{"class":1699},[871,5399,5390],{"class":4740},[871,5401,5254],{"class":1699},[871,5403,5404,5406,5409,5411,5414,5416,5418,5420],{"class":873,"line":954},[871,5405,5274],{"class":1699},[871,5407,5408],{"class":4740},"ArtistRole",[871,5410,5280],{"class":1699},[871,5412,5413],{"class":877},"MainArtist",[871,5415,5286],{"class":1699},[871,5417,5408],{"class":4740},[871,5419,5280],{"class":1699},[871,5421,5422],{"class":4723},"  \u003C!-- No \"AI\" option here -->\n",[871,5424,5425,5427,5429],{"class":873,"line":960},[871,5426,5345],{"class":1699},[871,5428,5365],{"class":4740},[871,5430,5254],{"class":1699},[871,5432,5433],{"class":873,"line":966},[871,5434,927],{"emptyLinePlaceholder":926},[871,5436,5437],{"class":873,"line":972},[871,5438,5439],{"class":4723},"  \u003C!-- HOW: the deal terms -->\n",[871,5441,5442,5444,5447],{"class":873,"line":978},[871,5443,5264],{"class":1699},[871,5445,5446],{"class":4740},"Deal",[871,5448,5254],{"class":1699},[871,5450,5451,5453,5456,5458,5461,5463,5465],{"class":873,"line":983},[871,5452,5274],{"class":1699},[871,5454,5455],{"class":4740},"Model",[871,5457,5280],{"class":1699},[871,5459,5460],{"class":877},"SubscriptionModel",[871,5462,5286],{"class":1699},[871,5464,5455],{"class":4740},[871,5466,5254],{"class":1699},[871,5468,5469,5471,5474,5476,5479,5481,5483],{"class":873,"line":989},[871,5470,5274],{"class":1699},[871,5472,5473],{"class":4740},"UseType",[871,5475,5280],{"class":1699},[871,5477,5478],{"class":877},"OnDemandStream",[871,5480,5286],{"class":1699},[871,5482,5473],{"class":4740},[871,5484,5254],{"class":1699},[871,5486,5487,5489,5492,5494,5497,5499,5501],{"class":873,"line":995},[871,5488,5274],{"class":1699},[871,5490,5491],{"class":4740},"StartDate",[871,5493,5280],{"class":1699},[871,5495,5496],{"class":877},"2026-03-13",[871,5498,5286],{"class":1699},[871,5500,5491],{"class":4740},[871,5502,5254],{"class":1699},[871,5504,5505,5507,5509],{"class":873,"line":1001},[871,5506,5345],{"class":1699},[871,5508,5446],{"class":4740},[871,5510,5254],{"class":1699},[871,5512,5513,5515,5517],{"class":873,"line":1006},[871,5514,5286],{"class":1699},[871,5516,5251],{"class":4740},[871,5518,5254],{"class":1699},[812,5520,5521],{},[748,5522,5523,5524,5526,5527,5529],{},"Notice how the DDEX schema has no concept of \"AI-generated.\" The ",[800,5525,5408],{}," is ",[800,5528,5413],{},", which traditionally means a human performer. This is exactly the gap that combining C2PA provenance with DDEX metadata would fill.",[834,5531,5533],{"id":5532},"real-world-use-cases","Real-world use cases",[760,5535,5537,5553,5569,5585],{"className":5536},[763,764,765,766,767],[769,5538,5542],{"description":5539,"icon":5540,"title":5541},"A service like ElevenLabs or Kits.AI generates a vocal track using a licensed artist voice model.","i-lucide-mic","AI vocal cloning",[1225,5543,5544,5547,5550],{},[1228,5545,5546],{},"C2PA manifest declares the output as AI-generated, referencing the voice model license",[1228,5548,5549],{},"DDEX metadata routes royalties to both the platform and the original voice owner",[1228,5551,5552],{},"DSPs can surface an \"AI-generated vocal\" label to listeners",[769,5554,5558],{"description":5555,"icon":5556,"title":5557},"A music supervisor finds a track on a sync platform and needs to clear rights quickly.","i-lucide-radio","Sync licensing for film/TV",[1225,5559,5560,5563,5566],{},[1228,5561,5562],{},"C2PA chain confirms the track is an unaltered original from a known studio",[1228,5564,5565],{},"DDEX rights data shows territory clearance, splits, and one-stop licensing",[1228,5567,5568],{},"The supervisor can verify authenticity and clear rights in a single workflow",[769,5570,5574],{"description":5571,"icon":5572,"title":5573},"A producer builds a track using stems from Splice or Tracklib.","i-lucide-disc-3","Sample-based production",[1225,5575,5576,5579,5582],{},[1228,5577,5578],{},"Each stem carries a C2PA manifest linking to its original recording session",[1228,5580,5581],{},"The DAW adds a new manifest referencing all source stems on export",[1228,5583,5584],{},"DDEX metadata captures royalty splits between the producer and sample owners",[769,5586,5590],{"description":5587,"icon":5588,"title":5589},"A streaming platform receives a submission that sounds like a major artist from an unknown account.","i-lucide-shield-alert","Deepfake detection at DSPs",[1225,5591,5592,5595,5598],{},[1228,5593,5594],{},"No C2PA manifest present, or the manifest shows AI generation with no artist license",[1228,5596,5597],{},"DDEX metadata claims the submitter as the performer, contradicting the audio fingerprint",[1228,5599,5600],{},"Automated pipeline flags the submission for human review before it goes live",[752,5602,5604],{"id":5603},"looking-ahead","Looking ahead",[748,5606,5607,5608,3807,5611,5614],{},"The music industry is approaching a tipping point. As AI-generated content floods platforms, the demand for both ",[1231,5609,5610],{},"authenticity verification",[1231,5612,5613],{},"rights management"," will only grow.",[748,5616,5617],{},"The platforms that win will be the ones that treat provenance and rights as two sides of the same coin. C2PA and DDEX aren't competitors. Together, they could form the trust layer the music industry needs.",[748,5619,5620],{},"For music tech builders, the action items are clear:",[5622,5623,5624,5630,5636,5642],"ol",{},[1228,5625,5626,5629],{},[1231,5627,5628],{},"Embed C2PA manifests"," at the point of content creation -whether that's a DAW, an AI model, or a recording device",[1228,5631,5632,5635],{},[1231,5633,5634],{},"Extend DDEX workflows"," to consume and reference C2PA provenance data",[1228,5637,5638,5641],{},[1231,5639,5640],{},"Build cross-validation"," into ingest pipelines to catch mismatches between authenticity claims and rights declarations",[1228,5643,5644,5647],{},[1231,5645,5646],{},"Engage with both consortiums"," -the standards are still evolving, and the music industry's voice matters in shaping them",[748,5649,5650],{},"The question isn't whether these standards will converge -it's how quickly the industry can make it happen.",[1409,5652,5653],{},"html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":867,"searchDepth":881,"depth":881,"links":5655},[5656,5660,5664,5665,5668,5673,5674,5675,5680],{"id":3820,"depth":881,"text":3821,"children":5657},[5658,5659],{"id":3827,"depth":887,"text":3828},{"id":3870,"depth":887,"text":3871},{"id":3905,"depth":881,"text":3906,"children":5661},[5662,5663],{"id":3912,"depth":887,"text":3913},{"id":3993,"depth":887,"text":3994},{"id":4039,"depth":881,"text":4040},{"id":4209,"depth":881,"text":4210,"children":5666},[5667],{"id":4263,"depth":887,"text":4264},{"id":4288,"depth":881,"text":4289,"children":5669},[5670,5671,5672],{"id":4295,"depth":887,"text":4296},{"id":4313,"depth":887,"text":4314},{"id":4346,"depth":887,"text":4347},{"id":4479,"depth":881,"text":4480},{"id":4630,"depth":881,"text":4631},{"id":4685,"depth":881,"text":4686,"children":5676},[5677,5678,5679],{"id":4689,"depth":887,"text":4690},{"id":5219,"depth":887,"text":5220},{"id":5532,"depth":887,"text":5533},{"id":5603,"depth":881,"text":5604},"2026-03-13T00:00:00.000Z","C2PA proves content is real. DDEX ensures the right people get paid. Together, could they reshape how the music industry handles trust and rights in the AI era?",[5684,5687,5690],{"question":5685,"answer":5686},"What is the difference between C2PA and DDEX?","C2PA is a content authenticity standard that cryptographically proves who created digital content and whether it was modified. DDEX is a music industry standard for exchanging commercial metadata like rights ownership, royalty splits, and release information. C2PA answers 'is this real?' while DDEX answers 'who gets paid?'",{"question":5688,"answer":5689},"Can C2PA and DDEX work together?","Yes. A music file could carry both a C2PA manifest proving its origin and creation history, and DDEX metadata ensuring correct royalty distribution. Together they provide end-to-end trust -from authenticity to payment.",{"question":5691,"answer":5692},"Why do these standards matter for AI-generated music?","AI-generated tracks blur the line between human and machine creation. C2PA can transparently label AI-generated content, while DDEX can handle the complex rights questions around who owns and profits from AI-created music.",{"src":5694},"/images/blog/musictechlab_blog_c2pa-vs-ddex.webp",{"enabled":926,"items":5696},[5697,5700,5703,5706],{"text":5698,"icon":5699},"C2PA proves content origin with cryptographic signatures; DDEX handles rights and royalty splits.","i-lucide-shield",{"text":5701,"icon":5702},"Current DDEX schemas have no concept of AI-generated content or non-human performers.","i-lucide-brain",{"text":5704,"icon":5705},"Combining both standards creates end-to-end trust from authenticity verification to payment.","i-lucide-handshake",{"text":5707,"icon":2328},"C2PA tools in Rust, JavaScript, and Python are production-ready for experimentation today.",{},{"title":5710,"description":5711},"C2PA & DDEX: Authenticity & Rights in AI Music","Compare C2PA and DDEX standards -how content provenance and rights metadata work together to solve trust and payment in the AI music era.",[3814,3817,5713,5714,5715,1470,5716],"AI music","content authenticity","music rights","music distribution","gAC7wVP0DrbqIReV_k8NunYO6AEVCudMp3VZZ9-1zfY",1780305139637]