[{"data":1,"prerenderedAt":5914},["ShallowReactive",2],{"navigation":3,"/blog/music-data/mtl-bandcamp-mcp-open-source-revenue-dashboard-post":734,"/blog/music-data/mtl-bandcamp-mcp-open-source-revenue-dashboard-surround":2066,"/blog/music-data/mtl-bandcamp-mcp-open-source-revenue-dashboard-related":2071},[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":168,"authors":736,"badge":742,"body":745,"category":2020,"client":2021,"date":2022,"description":2023,"extension":2024,"faq":2025,"featured":69,"featuredOrder":2021,"hidden":69,"image":2038,"keyTakeaways":2040,"meta":2054,"navigation":2041,"path":169,"seo":2055,"status":2021,"stem":170,"tags":2058,"teaser":2021,"__hash__":2065},"posts/blog/music-data/mtl-bandcamp-mcp-open-source-revenue-dashboard.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":743,"color":744},"Open Source","#7c3aed",{"type":746,"value":747,"toc":1994},"minimark",[748,757,763,768,777,807,814,818,821,843,851,855,860,920,924,977,981,1052,1056,1059,1063,1066,1077,1080,1093,1161,1165,1171,1174,1278,1282,1288,1408,1423,1427,1433,1436,1440,1443,1533,1539,1543,1546,1552,1627,1633,1702,1708,1753,1756,1760,1763,1767,1786,1789,1793,1797,1834,1838,1882,1886,1893,1913,1916,1929,1933,1936,1959,1969,1972,1975,1982,1987,1990],[749,750,751,752,756],"p",{},"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 ",[753,754,755],"strong",{},"mtl-bandcamp-mcp"," so you can query your Bandcamp earnings using natural language, without leaving the terminal.",[758,759,760],"note",{},[749,761,762],{},"All artist names, revenue figures, and catalog numbers in this article are fictional. We use fake data throughout to demonstrate the tool's capabilities.",[764,765,767],"h2",{"id":766},"why-we-built-this","Why We Built This",[749,769,770,771,776],{},"At MusicTech Lab, we built ",[772,773,775],"a",{"href":774},"/services/musicdata-lab","MusicData Lab"," - 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:",[778,779,786,792,797,802],"div",{"className":780},[781,782,783,784,785],"grid","grid-cols-1","md:grid-cols-2","gap-4","my-8",[787,788],"spotlight-card",{"description":789,"icon":790,"title":791},"See totals, margins, and fee breakdowns at a glance.","i-lucide-layout-dashboard","Dashboard view",[787,793],{"description":794,"icon":795,"title":796},"Revenue grouped by artist with share percentages.","i-lucide-users","Artist splits",[787,798],{"description":799,"icon":800,"title":801},"Rank items by net revenue, gross revenue, or quantity sold.","i-lucide-trophy","Top sellers",[787,803],{"description":804,"icon":805,"title":806},"Full detail for any catalog number including UPC, ISRC, and region.","i-lucide-search","Item lookup",[749,808,809,810,813],{},"Since we already use Claude Code for development, building an MCP server was the natural choice. We took a similar approach with our ",[772,811,812],{"href":85},"AI-powered analytics dashboard",", where business users query streaming royalty data in plain English and get interactive charts back.",[764,815,817],{"id":816},"the-tools","The Tools",[749,819,820],{},"mtl-bandcamp-mcp exposes five tools:",[778,822,824,829,834,838],{"className":823},[781,782,783,784,785],[787,825],{"description":826,"icon":827,"title":828},"List available Bandcamp CSV report files in the configured reports directory.","i-lucide-folder-open","bandcamp_list_reports",[787,830],{"description":831,"icon":832,"title":833},"Dashboard summary with totals, net margin, and a full fee breakdown by category.","i-lucide-bar-chart-3","bandcamp_summary",[787,835],{"description":836,"icon":795,"title":837},"Revenue grouped by artist showing quantity, gross, net, and share of total.","bandcamp_by_artist",[787,839],{"description":840,"icon":841,"title":842},"Top-selling items sorted by net revenue, gross revenue, or quantity.","i-lucide-arrow-up-down","bandcamp_top_items",[778,844,846],{"className":845},[781,782,783,784,785],[787,847],{"description":848,"icon":849,"title":850},"Full detail for a specific catalog number: UPC, ISRC, region, all fees, and net revenue.","i-lucide-file-search","bandcamp_item_detail",[764,852,854],{"id":853},"dashboard-fields","Dashboard Fields",[856,857,859],"h3",{"id":858},"summary-metrics","Summary metrics",[861,862,863,876],"table",{},[864,865,866],"thead",{},[867,868,869,873],"tr",{},[870,871,872],"th",{},"Metric",[870,874,875],{},"Description",[877,878,879,888,896,904,912],"tbody",{},[867,880,881,885],{},[882,883,884],"td",{},"Items sold",[882,886,887],{},"Total quantity across all line items",[867,889,890,893],{},[882,891,892],{},"Unique artists",[882,894,895],{},"Number of distinct artists in the report",[867,897,898,901],{},[882,899,900],{},"Gross revenue",[882,902,903],{},"Total revenue before deductions",[867,905,906,909],{},[882,907,908],{},"Net revenue",[882,910,911],{},"Revenue after all fees and taxes",[867,913,914,917],{},[882,915,916],{},"Net margin",[882,918,919],{},"Net as a percentage of gross",[856,921,923],{"id":922},"fee-breakdown","Fee breakdown",[861,925,926,935],{},[864,927,928],{},[867,929,930,933],{},[870,931,932],{},"Fee type",[870,934,875],{},[877,936,937,945,953,961,969],{},[867,938,939,942],{},[882,940,941],{},"Taxes",[882,943,944],{},"VAT and other taxes collected",[867,946,947,950],{},[882,948,949],{},"Bandcamp share",[882,951,952],{},"Bandcamp's assessed revenue share",[867,954,955,958],{},[882,956,957],{},"Collection society",[882,959,960],{},"Royalty collection society share",[867,962,963,966],{},[882,964,965],{},"Payment processing",[882,967,968],{},"Payment processor fees",[867,970,971,974],{},[882,972,973],{},"Shipping",[882,975,976],{},"Physical goods shipping costs",[856,978,980],{"id":979},"item-detail","Item detail",[861,982,983,995],{},[864,984,985],{},[867,986,987,990,992],{},[870,988,989],{},"Field",[870,991,875],{},[870,993,994],{},"Example",[877,996,997,1008,1019,1030,1041],{},[867,998,999,1002,1005],{},[882,1000,1001],{},"Cat no.",[882,1003,1004],{},"Catalog number",[882,1006,1007],{},"\"MDL-2939\"",[867,1009,1010,1013,1016],{},[882,1011,1012],{},"UPC",[882,1014,1015],{},"Universal Product Code",[882,1017,1018],{},"\"5060000000001\"",[867,1020,1021,1024,1027],{},[882,1022,1023],{},"ISRC",[882,1025,1026],{},"International Standard Recording Code",[882,1028,1029],{},"\"GBAP01900028\"",[867,1031,1032,1035,1038],{},[882,1033,1034],{},"Item type",[882,1036,1037],{},"Track, album, or merch",[882,1039,1040],{},"\"track\"",[867,1042,1043,1046,1049],{},[882,1044,1045],{},"Region",[882,1047,1048],{},"Buyer's region",[882,1050,1051],{},"\"United Kingdom\"",[764,1053,1055],{"id":1054},"how-it-works-in-practice","How It Works in Practice",[749,1057,1058],{},"Once installed, you just talk to Claude Code. No spreadsheet formulas, no pivot tables, no context switching.",[856,1060,1062],{"id":1061},"viewing-the-dashboard","Viewing the dashboard",[749,1064,1065],{},"Ask Claude for a summary:",[1067,1068,1074],"pre",{"className":1069,"code":1071,"language":1072,"meta":1073},[1070],"language-text","> Show me a summary of my latest Bandcamp revenue report\n","text","",[1075,1076,1071],"code",{"__ignoreMap":1073},[749,1078,1079],{},"Claude finds the most recent CSV and returns a formatted dashboard:",[749,1081,1082,1085,1086,1089,1092],{},[753,1083,1084],{},"Report:"," ",[1075,1087,1088],{},"bandcamp-rev-report-2026-q1.csv",[753,1090,1091],{},"Period:"," 2026-01-01 to 2026-03-31",[861,1094,1095,1104],{},[864,1096,1097],{},[867,1098,1099,1101],{},[870,1100,872],{},[870,1102,1103],{},"Value",[877,1105,1106,1113,1121,1128,1135,1143,1154],{},[867,1107,1108,1110],{},[882,1109,884],{},[882,1111,1112],{},"847",[867,1114,1115,1118],{},[882,1116,1117],{},"Line items",[882,1119,1120],{},"312",[867,1122,1123,1125],{},[882,1124,892],{},[882,1126,1127],{},"24",[867,1129,1130,1132],{},[882,1131,900],{},[882,1133,1134],{},"12,450.00 GBP",[867,1136,1137,1140],{},[882,1138,1139],{},"Total deductions",[882,1141,1142],{},"3,290.75 GBP",[867,1144,1145,1149],{},[882,1146,1147],{},[753,1148,908],{},[882,1150,1151],{},[753,1152,1153],{},"9,159.25 GBP",[867,1155,1156,1158],{},[882,1157,916],{},[882,1159,1160],{},"73.6%",[856,1162,1164],{"id":1163},"checking-artist-splits","Checking artist splits",[1067,1166,1169],{"className":1167,"code":1168,"language":1072,"meta":1073},[1070],"> Which artists earned the most this quarter?\n",[1075,1170,1168],{"__ignoreMap":1073},[749,1172,1173],{},"Claude groups revenue by artist and shows each one's share:",[861,1175,1176,1198],{},[864,1177,1178],{},[867,1179,1180,1183,1186,1189,1192,1195],{},[870,1181,1182],{},"Artist",[870,1184,1185],{},"Items",[870,1187,1188],{},"Qty Sold",[870,1190,1191],{},"Gross",[870,1193,1194],{},"Net",[870,1196,1197],{},"Share",[877,1199,1200,1220,1240,1259],{},[867,1201,1202,1205,1208,1211,1214,1217],{},[882,1203,1204],{},"Solar Cole",[882,1206,1207],{},"3",[882,1209,1210],{},"18",[882,1212,1213],{},"167.27 GBP",[882,1215,1216],{},"129.38 GBP",[882,1218,1219],{},"53.9%",[867,1221,1222,1225,1228,1231,1234,1237],{},[882,1223,1224],{},"The Fox Alliance",[882,1226,1227],{},"1",[882,1229,1230],{},"6",[882,1232,1233],{},"64.55 GBP",[882,1235,1236],{},"53.11 GBP",[882,1238,1239],{},"22.1%",[867,1241,1242,1245,1247,1250,1253,1256],{},[882,1243,1244],{},"Midnight Storm",[882,1246,1227],{},[882,1248,1249],{},"4",[882,1251,1252],{},"33.57 GBP",[882,1254,1255],{},"28.81 GBP",[882,1257,1258],{},"12.0%",[867,1260,1261,1264,1267,1269,1272,1275],{},[882,1262,1263],{},"Iris Grove",[882,1265,1266],{},"2",[882,1268,1266],{},[882,1270,1271],{},"16.80 GBP",[882,1273,1274],{},"11.72 GBP",[882,1276,1277],{},"4.9%",[856,1279,1281],{"id":1280},"finding-top-sellers","Finding top sellers",[1067,1283,1286],{"className":1284,"code":1285,"language":1072,"meta":1073},[1070],"> What are the top 5 items by quantity sold?\n",[1075,1287,1285],{"__ignoreMap":1073},[861,1289,1290,1312],{},[864,1291,1292],{},[867,1293,1294,1297,1300,1302,1305,1308,1310],{},[870,1295,1296],{},"#",[870,1298,1299],{},"Item",[870,1301,1182],{},[870,1303,1304],{},"Type",[870,1306,1307],{},"Qty",[870,1309,1191],{},[870,1311,1194],{},[877,1313,1314,1335,1352,1371,1388],{},[867,1315,1316,1318,1321,1323,1326,1329,1332],{},[882,1317,1227],{},[882,1319,1320],{},"The Little Fantasies",[882,1322,1204],{},[882,1324,1325],{},"album",[882,1327,1328],{},"9",[882,1330,1331],{},"83.87 GBP",[882,1333,1334],{},"64.31 GBP",[867,1336,1337,1339,1342,1344,1346,1348,1350],{},[882,1338,1266],{},[882,1340,1341],{},"Short Dreams",[882,1343,1224],{},[882,1345,1325],{},[882,1347,1230],{},[882,1349,1233],{},[882,1351,1236],{},[867,1353,1354,1356,1359,1361,1363,1365,1368],{},[882,1355,1207],{},[882,1357,1358],{},"The Open Offerings",[882,1360,1204],{},[882,1362,1325],{},[882,1364,1230],{},[882,1366,1367],{},"55.02 GBP",[882,1369,1370],{},"44.01 GBP",[867,1372,1373,1375,1378,1380,1382,1384,1386],{},[882,1374,1249],{},[882,1376,1377],{},"The Broad Chorus",[882,1379,1244],{},[882,1381,1325],{},[882,1383,1249],{},[882,1385,1252],{},[882,1387,1255],{},[867,1389,1390,1393,1396,1398,1400,1402,1405],{},[882,1391,1392],{},"5",[882,1394,1395],{},"Premier Visions",[882,1397,1204],{},[882,1399,1325],{},[882,1401,1207],{},[882,1403,1404],{},"28.38 GBP",[882,1406,1407],{},"21.06 GBP",[749,1409,1410,1411,1414,1415,1418,1419,1422],{},"You can sort by ",[1075,1412,1413],{},"net",", ",[1075,1416,1417],{},"gross",", or ",[1075,1420,1421],{},"quantity"," and set any limit.",[856,1424,1426],{"id":1425},"looking-up-a-specific-item","Looking up a specific item",[1067,1428,1431],{"className":1429,"code":1430,"language":1072,"meta":1073},[1070],"> Show me all the details for catalog number MDL-2939\n",[1075,1432,1430],{"__ignoreMap":1073},[749,1434,1435],{},"Claude returns every field for that item: UPC, ISRC, region, item type, and a full fee breakdown.",[856,1437,1439],{"id":1438},"more-prompt-ideas","More prompt ideas",[749,1441,1442],{},"Here are some real-world prompts you can try. Click each one to see the result:",[778,1444,1447,1473,1488,1503,1518],{"className":1445},[1446,785],"space-y-2",[1448,1449,1457,1461],"details",{"className":1450},[1451,1452,1453,1454,1455,1456],"rounded-lg","border","border-gray-700","px-4","py-3","cursor-pointer",[1458,1459,1460],"summary",{},"List all available Bandcamp reports",[778,1462,1466],{"className":1463},[1464,1451,1452,1453,1465],"mt-4","overflow-hidden",[749,1467,1468],{},[1469,1470],"img",{"alt":1471,"src":1472},"Listing available Bandcamp reports in Claude Code","/images/blog/musictechlab_blog_mtl-bandcamp-mcp-list-reports.webp",[1448,1474,1476,1479],{"className":1475},[1451,1452,1453,1454,1455,1456],[1458,1477,1478],{},"What are the top 5 items by quantity sold?",[778,1480,1482],{"className":1481},[1464,1451,1452,1453,1465],[749,1483,1484],{},[1469,1485],{"alt":1486,"src":1487},"Top 5 items by quantity sold in Claude Code","/images/blog/musictechlab_blog_mtl-bandcamp-mcp-top-items.webp",[1448,1489,1491,1494],{"className":1490},[1451,1452,1453,1454,1455,1456],[1458,1492,1493],{},"How much did we pay in Bandcamp fees this quarter?",[778,1495,1497],{"className":1496},[1464,1451,1452,1453,1465],[749,1498,1499],{},[1469,1500],{"alt":1501,"src":1502},"Bandcamp fee breakdown in Claude Code","/images/blog/musictechlab_blog_mtl-bandcamp-mcp-fees.webp",[1448,1504,1506,1509],{"className":1505},[1451,1452,1453,1454,1455,1456],[1458,1507,1508],{},"Which artist has the best net margin?",[778,1510,1512],{"className":1511},[1464,1451,1452,1453,1465],[749,1513,1514],{},[1469,1515],{"alt":1516,"src":1517},"Artist net margin analysis in Claude Code","/images/blog/musictechlab_blog_mtl-bandcamp-mcp-margin.webp",[1448,1519,1521,1524],{"className":1520},[1451,1452,1453,1454,1455,1456],[1458,1522,1523],{},"Show me the fee breakdown — what percentage goes to taxes vs Bandcamp vs payment processing?",[778,1525,1527],{"className":1526},[1464,1451,1452,1453,1465],[749,1528,1529],{},[1469,1530],{"alt":1531,"src":1532},"Fee breakdown by percentage in Claude Code","/images/blog/musictechlab_blog_mtl-bandcamp-mcp-fee-breakdown.webp",[1534,1535,1536],"tip",{},[749,1537,1538],{},"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.",[856,1540,1542],{"id":1541},"visualizing-the-data","Visualizing the data",[749,1544,1545],{},"You can also generate charts from the report data. Just ask:",[1067,1547,1550],{"className":1548,"code":1549,"language":1072,"meta":1073},[1070],"> Show me which artists earned the most as a chart\n",[1075,1551,1549],{"__ignoreMap":1073},[1067,1553,1557],{"className":1554,"code":1555,"language":1556,"meta":1073,"style":1073},"language-mermaid shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","---\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","mermaid",[1075,1558,1559,1568,1574,1580,1586,1592,1597,1603,1609,1615,1621],{"__ignoreMap":1073},[1560,1561,1564],"span",{"class":1562,"line":1563},"line",1,[1560,1565,1567],{"class":1566},"sTEyZ","---\n",[1560,1569,1571],{"class":1562,"line":1570},2,[1560,1572,1573],{"class":1566},"config:\n",[1560,1575,1577],{"class":1562,"line":1576},3,[1560,1578,1579],{"class":1566},"    xyChart:\n",[1560,1581,1583],{"class":1562,"line":1582},4,[1560,1584,1585],{"class":1566},"        width: 800\n",[1560,1587,1589],{"class":1562,"line":1588},5,[1560,1590,1591],{"class":1566},"        height: 500\n",[1560,1593,1595],{"class":1562,"line":1594},6,[1560,1596,1567],{"class":1566},[1560,1598,1600],{"class":1562,"line":1599},7,[1560,1601,1602],{"class":1566},"xychart-beta\n",[1560,1604,1606],{"class":1562,"line":1605},8,[1560,1607,1608],{"class":1566},"    title \"Net Revenue by Artist (GBP)\"\n",[1560,1610,1612],{"class":1562,"line":1611},9,[1560,1613,1614],{"class":1566},"    x-axis [\"Solar Cole\", \"Fox Alliance\", \"Midnight Storm\", \"Iris Grove\", \"Shaw Protocol\", \"Orion Webb\", \"Zane Element\"]\n",[1560,1616,1618],{"class":1562,"line":1617},10,[1560,1619,1620],{"class":1566},"    y-axis \"Net Revenue (GBP)\" 0 --> 140\n",[1560,1622,1624],{"class":1562,"line":1623},11,[1560,1625,1626],{"class":1566},"    bar [129.38, 53.11, 28.81, 11.72, 9.42, 6.82, 0.78]\n",[1067,1628,1631],{"className":1629,"code":1630,"language":1072,"meta":1073},[1070],"> Show me the revenue share breakdown as a pie chart\n",[1075,1632,1630],{"__ignoreMap":1073},[1067,1634,1636],{"className":1554,"code":1635,"language":1556,"meta":1073,"style":1073},"---\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",[1075,1637,1638,1642,1646,1651,1656,1660,1665,1670,1675,1680,1685,1690,1696],{"__ignoreMap":1073},[1560,1639,1640],{"class":1562,"line":1563},[1560,1641,1567],{"class":1566},[1560,1643,1644],{"class":1562,"line":1570},[1560,1645,1573],{"class":1566},[1560,1647,1648],{"class":1562,"line":1576},[1560,1649,1650],{"class":1566},"    pie:\n",[1560,1652,1653],{"class":1562,"line":1582},[1560,1654,1655],{"class":1566},"        useWidth: 700\n",[1560,1657,1658],{"class":1562,"line":1588},[1560,1659,1567],{"class":1566},[1560,1661,1662],{"class":1562,"line":1594},[1560,1663,1664],{"class":1566},"pie title Revenue Share by Artist\n",[1560,1666,1667],{"class":1562,"line":1599},[1560,1668,1669],{"class":1566},"    \"Solar Cole\" : 53.9\n",[1560,1671,1672],{"class":1562,"line":1605},[1560,1673,1674],{"class":1566},"    \"The Fox Alliance\" : 22.1\n",[1560,1676,1677],{"class":1562,"line":1611},[1560,1678,1679],{"class":1566},"    \"Midnight Storm\" : 12.0\n",[1560,1681,1682],{"class":1562,"line":1617},[1560,1683,1684],{"class":1566},"    \"Iris Grove\" : 4.9\n",[1560,1686,1687],{"class":1562,"line":1623},[1560,1688,1689],{"class":1566},"    \"The Shaw Protocol\" : 3.9\n",[1560,1691,1693],{"class":1562,"line":1692},12,[1560,1694,1695],{"class":1566},"    \"Orion Webb\" : 2.8\n",[1560,1697,1699],{"class":1562,"line":1698},13,[1560,1700,1701],{"class":1566},"    \"The Zane Element\" : 0.3\n",[1067,1703,1706],{"className":1704,"code":1705,"language":1072,"meta":1073},[1070],"> What percentage of fees goes to taxes vs Bandcamp vs payment processing?\n",[1075,1707,1705],{"__ignoreMap":1073},[1067,1709,1711],{"className":1554,"code":1710,"language":1556,"meta":1073,"style":1073},"---\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",[1075,1712,1713,1717,1721,1725,1729,1733,1738,1743,1748],{"__ignoreMap":1073},[1560,1714,1715],{"class":1562,"line":1563},[1560,1716,1567],{"class":1566},[1560,1718,1719],{"class":1562,"line":1570},[1560,1720,1573],{"class":1566},[1560,1722,1723],{"class":1562,"line":1576},[1560,1724,1650],{"class":1566},[1560,1726,1727],{"class":1562,"line":1582},[1560,1728,1655],{"class":1566},[1560,1730,1731],{"class":1562,"line":1588},[1560,1732,1567],{"class":1566},[1560,1734,1735],{"class":1562,"line":1594},[1560,1736,1737],{"class":1566},"pie title Fee Breakdown (% of Total Fees)\n",[1560,1739,1740],{"class":1562,"line":1599},[1560,1741,1742],{"class":1566},"    \"Taxes\" : 46.6\n",[1560,1744,1745],{"class":1562,"line":1605},[1560,1746,1747],{"class":1566},"    \"Bandcamp Share\" : 31.2\n",[1560,1749,1750],{"class":1562,"line":1611},[1560,1751,1752],{"class":1566},"    \"Payment Processing\" : 22.1\n",[749,1754,1755],{},"All charts are rendered inline, with the site's dark theme and brand styling. No spreadsheet, no BI tool, no context switching.",[764,1757,1759],{"id":1758},"handling-bandcamps-csv-format","Handling Bandcamp's CSV Format",[749,1761,1762],{},"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.",[764,1764,1766],{"id":1765},"tech-stack","Tech Stack",[778,1768,1771,1776,1781],{"className":1769},[781,782,1770,784,785],"md:grid-cols-3",[787,1772],{"description":1773,"icon":1774,"title":1775},"With Poetry for dependency management.","i-lucide-code","Python 3.10+",[787,1777],{"description":1778,"icon":1779,"title":1780},"Standard library CSV parsing with smart encoding detection.","i-lucide-table","csv + io",[787,1782],{"description":1783,"icon":1784,"title":1785},"Model Context Protocol server framework.","i-lucide-cpu","FastMCP",[749,1787,1788],{},"The entire codebase is a single server module with clean, focused logic.",[764,1790,1792],{"id":1791},"getting-started","Getting Started",[856,1794,1796],{"id":1795},"installation","Installation",[1067,1798,1802],{"className":1799,"code":1800,"language":1801,"meta":1073,"style":1073},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","git clone https://github.com/musictechlab/mtl-bandcamp-mcp.git\ncd mtl-bandcamp-mcp\npoetry install\n","bash",[1075,1803,1804,1817,1826],{"__ignoreMap":1073},[1560,1805,1806,1810,1814],{"class":1562,"line":1563},[1560,1807,1809],{"class":1808},"sBMFI","git",[1560,1811,1813],{"class":1812},"sfazB"," clone",[1560,1815,1816],{"class":1812}," https://github.com/musictechlab/mtl-bandcamp-mcp.git\n",[1560,1818,1819,1823],{"class":1562,"line":1570},[1560,1820,1822],{"class":1821},"s2Zo4","cd",[1560,1824,1825],{"class":1812}," mtl-bandcamp-mcp\n",[1560,1827,1828,1831],{"class":1562,"line":1576},[1560,1829,1830],{"class":1808},"poetry",[1560,1832,1833],{"class":1812}," install\n",[856,1835,1837],{"id":1836},"register-with-claude-code","Register with Claude Code",[1067,1839,1841],{"className":1799,"code":1840,"language":1801,"meta":1073,"style":1073},"claude mcp add -s user mtl-bandcamp -- bash -c \"cd /path/to/mtl-bandcamp-mcp && poetry run python -m mtl_bandcamp_mcp\"\n",[1075,1842,1843],{"__ignoreMap":1073},[1560,1844,1845,1848,1851,1854,1857,1860,1863,1866,1869,1872,1876,1879],{"class":1562,"line":1563},[1560,1846,1847],{"class":1808},"claude",[1560,1849,1850],{"class":1812}," mcp",[1560,1852,1853],{"class":1812}," add",[1560,1855,1856],{"class":1812}," -s",[1560,1858,1859],{"class":1812}," user",[1560,1861,1862],{"class":1812}," mtl-bandcamp",[1560,1864,1865],{"class":1812}," --",[1560,1867,1868],{"class":1812}," bash",[1560,1870,1871],{"class":1812}," -c",[1560,1873,1875],{"class":1874},"sMK4o"," \"",[1560,1877,1878],{"class":1812},"cd /path/to/mtl-bandcamp-mcp && poetry run python -m mtl_bandcamp_mcp",[1560,1880,1881],{"class":1874},"\"\n",[856,1883,1885],{"id":1884},"configuration","Configuration",[749,1887,1888,1889,1892],{},"Set ",[1075,1890,1891],{},"BANDCAMP_REPORTS_DIR"," to point to the directory containing your Bandcamp CSV exports:",[1067,1894,1896],{"className":1799,"code":1895,"language":1801,"meta":1073,"style":1073},"export BANDCAMP_REPORTS_DIR=~/Documents/bandcamp-reports\n",[1075,1897,1898],{"__ignoreMap":1073},[1560,1899,1900,1904,1907,1910],{"class":1562,"line":1563},[1560,1901,1903],{"class":1902},"spNyl","export",[1560,1905,1906],{"class":1566}," BANDCAMP_REPORTS_DIR",[1560,1908,1909],{"class":1874},"=~",[1560,1911,1912],{"class":1566},"/Documents/bandcamp-reports\n",[749,1914,1915],{},"Restart Claude Code, and all five tools are available immediately.",[1534,1917,1918],{},[749,1919,1920,1921,1924,1925,1928],{},"You can verify the server is connected by running ",[1075,1922,1923],{},"claude mcp list"," - look for ",[1075,1926,1927],{},"mtl-bandcamp"," in the output.",[764,1930,1932],{"id":1931},"what-is-next","What is Next",[749,1934,1935],{},"This is version 0.1.0. Here is what we are considering for future releases:",[778,1937,1939,1944,1949,1954],{"className":1938},[781,782,783,784,785],[787,1940],{"description":1941,"icon":1942,"title":1943},"Compare two reports side by side to spot revenue trends and growth.","i-lucide-git-compare","Period Comparison",[787,1945],{"description":1946,"icon":1947,"title":1948},"Revenue grouped by buyer region to understand geographic demand.","i-lucide-map","Regional Breakdown",[787,1950],{"description":1951,"icon":1952,"title":1953},"Track revenue over multiple reporting periods with growth indicators.","i-lucide-line-chart","Trend Analysis",[787,1955],{"description":1956,"icon":1957,"title":1958},"Push dashboard data directly to Google Sheets for sharing with stakeholders.","i-lucide-file-output","Export to Sheets",[749,1960,1961,1962,1968],{},"Have an idea for a feature we have not thought of? We would love to hear it. ",[772,1963,1967],{"href":1964,"rel":1965},"https://musictechlab.io/contact",[1966],"nofollow","Let's connect"," and shape the roadmap together.",[764,1970,743],{"id":1971},"open-source",[749,1973,1974],{},"mtl-bandcamp-mcp is MIT licensed and available on GitHub:",[749,1976,1977],{},[772,1978,1981],{"href":1979,"rel":1980},"https://github.com/musictechlab/mtl-bandcamp-mcp",[1966],"github.com/musictechlab/mtl-bandcamp-mcp",[758,1983,1984],{},[749,1985,1986],{},"This project is experimental and in early development. Revenue data is read-only - the server never modifies your CSV files.",[749,1988,1989],{},"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.",[1991,1992,1993],"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);}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":1073,"searchDepth":1570,"depth":1570,"links":1995},[1996,1997,1998,2003,2011,2012,2013,2018,2019],{"id":766,"depth":1570,"text":767},{"id":816,"depth":1570,"text":817},{"id":853,"depth":1570,"text":854,"children":1999},[2000,2001,2002],{"id":858,"depth":1576,"text":859},{"id":922,"depth":1576,"text":923},{"id":979,"depth":1576,"text":980},{"id":1054,"depth":1570,"text":1055,"children":2004},[2005,2006,2007,2008,2009,2010],{"id":1061,"depth":1576,"text":1062},{"id":1163,"depth":1576,"text":1164},{"id":1280,"depth":1576,"text":1281},{"id":1425,"depth":1576,"text":1426},{"id":1438,"depth":1576,"text":1439},{"id":1541,"depth":1576,"text":1542},{"id":1758,"depth":1570,"text":1759},{"id":1765,"depth":1570,"text":1766},{"id":1791,"depth":1570,"text":1792,"children":2014},[2015,2016,2017],{"id":1795,"depth":1576,"text":1796},{"id":1836,"depth":1576,"text":1837},{"id":1884,"depth":1576,"text":1885},{"id":1931,"depth":1570,"text":1932},{"id":1971,"depth":1570,"text":743},"music-data",null,"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.","md",[2026,2029,2032,2035],{"question":2027,"answer":2028},"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":2030,"answer":2031},"What file formats are supported?","Bandcamp CSV exports in both UTF-16 (Bandcamp default) and UTF-8 encodings.",{"question":2033,"answer":2034},"How do I install mtl-bandcamp-mcp?","Clone the repo, run poetry install, and register it with Claude Code using the claude mcp add command.",{"question":2036,"answer":2037},"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":2039},"/images/blog/musictechlab_blog_mtl-bandcamp-mcp.webp",{"enabled":2041,"items":2042},true,[2043,2045,2048,2051],{"text":2044,"icon":832},"Query Bandcamp revenue CSVs with natural language, no spreadsheets or pivot tables needed.",{"text":2046,"icon":2047},"Five tools cover dashboard summaries, artist splits, top sellers, and catalog item lookups.","i-lucide-blocks",{"text":2049,"icon":2050},"Handles Bandcamp's UTF-16 encoding transparently with automatic fallback to UTF-8.","i-lucide-file-text",{"text":2052,"icon":2053},"MIT licensed and open source, installable with Poetry and Claude Code in under 5 minutes.","i-lucide-terminal",{},{"title":2056,"description":2057},"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.",[2059,2060,1971,2061,2062,2063,2064],"MCP","Bandcamp","Claude Code","music-tech","revenue","analytics","NsosocH7kjl1Sr0ml9fAVbkUSd8V4s07sXDgk675THk",[2067,2069],{"title":164,"path":165,"stem":166,"description":2068,"children":-1},"What happens when a custom streaming analytics tool works perfectly, until nobody is responsible for keeping it running. A real story from the music industry.",{"title":172,"path":173,"stem":174,"description":2070,"children":-1},"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.",[2072,3086,4442,4464],{"id":2073,"title":172,"authors":2074,"badge":2077,"body":2078,"category":2020,"client":2021,"date":3054,"description":2070,"extension":2024,"faq":3055,"featured":69,"featuredOrder":2021,"hidden":69,"image":3067,"keyTakeaways":3069,"meta":3079,"navigation":2041,"path":173,"seo":3080,"status":2021,"stem":174,"tags":3083,"teaser":2021,"__hash__":3085,"score":1594},"posts/blog/music-data/mtl-metadata-mcp-open-source-audio-metadata-embedding.md",[2075],{"name":738,"to":739,"avatar":2076},{"src":741},{"label":743,"color":744},{"type":746,"value":2079,"toc":3036},[2080,2087,2101,2103,2106,2129,2132,2134,2137,2159,2163,2239,2241,2244,2248,2251,2257,2260,2464,2467,2473,2477,2480,2486,2489,2495,2499,2502,2508,2819,2825,2828,2834,2836,2839,2845,2851,2857,2863,2869,2875,2881,2886,2888,2900,2903,2905,2907,2934,2936,2969,2972,2981,2983,2985,3008,3013,3015,3018,3025,3030,3033],[749,2081,2082,2083,2086],{},"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 ",[753,2084,2085],{},"mtl-metadata-mcp"," to solve this problem directly from the command line, using natural language.",[758,2088,2089],{},[749,2090,2091,2094,2095,2100],{},[753,2092,2093],{},"What is MCP?"," The ",[772,2096,2099],{"href":2097,"rel":2098},"https://modelcontextprotocol.io/",[1966],"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.",[764,2102,767],{"id":766},[749,2104,2105],{},"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:",[778,2107,2109,2114,2119,2124],{"className":2108},[781,782,783,784,785],[787,2110],{"description":2111,"icon":2112,"title":2113},"Read metadata from any audio file and present it clearly.","i-lucide-book-open","Read metadata",[787,2115],{"description":2116,"icon":2117,"title":2118},"Write metadata using natural language commands.","i-lucide-pen-line","Write metadata",[787,2120],{"description":2121,"icon":2122,"title":2123},"Scan entire directories to find files with missing or incomplete tags.","i-lucide-scan-search","Scan directories",[787,2125],{"description":2126,"icon":2127,"title":2128},"Work inside our development workflow without switching contexts.","i-lucide-workflow","Stay in flow",[749,2130,2131],{},"Since we already use Claude Code for development, building an MCP server was the natural choice.",[764,2133,817],{"id":816},[749,2135,2136],{},"mtl-metadata-mcp exposes four tools:",[778,2138,2140,2144,2149,2154],{"className":2139},[781,782,783,784,785],[787,2141],{"description":2142,"icon":849,"title":2143},"Read current metadata tags and file info (format, duration, bitrate, sample rate, channels) from an audio file.","metadata_read",[787,2145],{"description":2146,"icon":2147,"title":2148},"Embed or update title, artist, album, date, genre, and ISRC. Only the fields you specify are changed.","i-lucide-file-pen","metadata_write",[787,2150],{"description":2151,"icon":2152,"title":2153},"Strip all metadata tags from a file. Audio data is preserved.","i-lucide-eraser","metadata_clear",[787,2155],{"description":2156,"icon":2157,"title":2158},"Scan a directory for audio files and report which metadata fields are present or missing.","i-lucide-folder-search","metadata_scan",[764,2160,2162],{"id":2161},"supported-fields","Supported Fields",[861,2164,2165,2175],{},[864,2166,2167],{},[867,2168,2169,2171,2173],{},[870,2170,989],{},[870,2172,875],{},[870,2174,994],{},[877,2176,2177,2188,2198,2208,2219,2230],{},[867,2178,2179,2182,2185],{},[882,2180,2181],{},"Title",[882,2183,2184],{},"Track name",[882,2186,2187],{},"\"Back in Black\"",[867,2189,2190,2192,2195],{},[882,2191,1182],{},[882,2193,2194],{},"Performer",[882,2196,2197],{},"\"AC/DC\"",[867,2199,2200,2203,2206],{},[882,2201,2202],{},"Album",[882,2204,2205],{},"Album name",[882,2207,2187],{},[867,2209,2210,2213,2216],{},[882,2211,2212],{},"Date",[882,2214,2215],{},"Release year",[882,2217,2218],{},"\"1980\"",[867,2220,2221,2224,2227],{},[882,2222,2223],{},"Genre",[882,2225,2226],{},"Music genre",[882,2228,2229],{},"\"Classic Rock\"",[867,2231,2232,2234,2236],{},[882,2233,1023],{},[882,2235,1026],{},[882,2237,2238],{},"\"AUAP07900028\"",[764,2240,1055],{"id":1054},[749,2242,2243],{},"Once installed, you just talk to Claude Code. No commands to memorize, no flags to look up.",[856,2245,2247],{"id":2246},"reading-metadata","Reading metadata",[749,2249,2250],{},"Ask Claude to read a file:",[1067,2252,2255],{"className":2253,"code":2254,"language":1072,"meta":1073},[1070],"> What metadata does back-in-black.mp3 have?\n",[1075,2256,2254],{"__ignoreMap":1073},[749,2258,2259],{},"The response comes back as structured data:",[1067,2261,2265],{"className":2262,"code":2263,"language":2264,"meta":1073,"style":1073},"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",[1075,2266,2267,2272,2296,2316,2333,2349,2365,2381,2395,2416,2436,2454,2459],{"__ignoreMap":1073},[1560,2268,2269],{"class":1562,"line":1563},[1560,2270,2271],{"class":1874},"{\n",[1560,2273,2274,2277,2280,2283,2286,2288,2291,2293],{"class":1562,"line":1570},[1560,2275,2276],{"class":1874},"  \"",[1560,2278,2279],{"class":1902},"file",[1560,2281,2282],{"class":1874},"\"",[1560,2284,2285],{"class":1874},":",[1560,2287,1875],{"class":1874},[1560,2289,2290],{"class":1812},"/Users/you/Music/back-in-black.mp3",[1560,2292,2282],{"class":1874},[1560,2294,2295],{"class":1874},",\n",[1560,2297,2298,2300,2303,2305,2307,2309,2312,2314],{"class":1562,"line":1576},[1560,2299,2276],{"class":1874},[1560,2301,2302],{"class":1902},"format",[1560,2304,2282],{"class":1874},[1560,2306,2285],{"class":1874},[1560,2308,1875],{"class":1874},[1560,2310,2311],{"class":1812},"mp3",[1560,2313,2282],{"class":1874},[1560,2315,2295],{"class":1874},[1560,2317,2318,2320,2323,2325,2327,2331],{"class":1562,"line":1582},[1560,2319,2276],{"class":1874},[1560,2321,2322],{"class":1902},"duration_seconds",[1560,2324,2282],{"class":1874},[1560,2326,2285],{"class":1874},[1560,2328,2330],{"class":2329},"sbssI"," 254.38",[1560,2332,2295],{"class":1874},[1560,2334,2335,2337,2340,2342,2344,2347],{"class":1562,"line":1588},[1560,2336,2276],{"class":1874},[1560,2338,2339],{"class":1902},"bitrate_kbps",[1560,2341,2282],{"class":1874},[1560,2343,2285],{"class":1874},[1560,2345,2346],{"class":2329}," 128",[1560,2348,2295],{"class":1874},[1560,2350,2351,2353,2356,2358,2360,2363],{"class":1562,"line":1594},[1560,2352,2276],{"class":1874},[1560,2354,2355],{"class":1902},"sample_rate_hz",[1560,2357,2282],{"class":1874},[1560,2359,2285],{"class":1874},[1560,2361,2362],{"class":2329}," 44100",[1560,2364,2295],{"class":1874},[1560,2366,2367,2369,2372,2374,2376,2379],{"class":1562,"line":1599},[1560,2368,2276],{"class":1874},[1560,2370,2371],{"class":1902},"channels",[1560,2373,2282],{"class":1874},[1560,2375,2285],{"class":1874},[1560,2377,2378],{"class":2329}," 2",[1560,2380,2295],{"class":1874},[1560,2382,2383,2385,2388,2390,2392],{"class":1562,"line":1605},[1560,2384,2276],{"class":1874},[1560,2386,2387],{"class":1902},"metadata",[1560,2389,2282],{"class":1874},[1560,2391,2285],{"class":1874},[1560,2393,2394],{"class":1874}," {\n",[1560,2396,2397,2400,2403,2405,2407,2409,2412,2414],{"class":1562,"line":1611},[1560,2398,2399],{"class":1874},"    \"",[1560,2401,2402],{"class":1808},"title",[1560,2404,2282],{"class":1874},[1560,2406,2285],{"class":1874},[1560,2408,1875],{"class":1874},[1560,2410,2411],{"class":1812},"Back in Black",[1560,2413,2282],{"class":1874},[1560,2415,2295],{"class":1874},[1560,2417,2418,2420,2423,2425,2427,2429,2432,2434],{"class":1562,"line":1617},[1560,2419,2399],{"class":1874},[1560,2421,2422],{"class":1808},"artist",[1560,2424,2282],{"class":1874},[1560,2426,2285],{"class":1874},[1560,2428,1875],{"class":1874},[1560,2430,2431],{"class":1812},"ACDC",[1560,2433,2282],{"class":1874},[1560,2435,2295],{"class":1874},[1560,2437,2438,2440,2443,2445,2447,2449,2452],{"class":1562,"line":1623},[1560,2439,2399],{"class":1874},[1560,2441,2442],{"class":1808},"genre",[1560,2444,2282],{"class":1874},[1560,2446,2285],{"class":1874},[1560,2448,1875],{"class":1874},[1560,2450,2451],{"class":1812},"Classic Rock",[1560,2453,1881],{"class":1874},[1560,2455,2456],{"class":1562,"line":1692},[1560,2457,2458],{"class":1874},"  }\n",[1560,2460,2461],{"class":1562,"line":1698},[1560,2462,2463],{"class":1874},"}\n",[749,2465,2466],{},"Claude then formats this into a readable table and points out missing fields - in this case, album, date, and ISRC.",[749,2468,2469],{},[1469,2470],{"alt":2471,"src":2472},"Reading metadata from back-in-black.mp3 in Claude Code","/images/blog/musictechlab_blog_mtl-metadata-mcp-read.webp",[856,2474,2476],{"id":2475},"writing-metadata","Writing metadata",[749,2478,2479],{},"Tell Claude what to fill in:",[1067,2481,2484],{"className":2482,"code":2483,"language":1072,"meta":1073},[1070],"> Set the album to \"Back in Black\", date to 1980, and ISRC to AUAP07900028\n",[1075,2485,2483],{"__ignoreMap":1073},[749,2487,2488],{},"Only the specified fields are updated. Everything else stays untouched.",[749,2490,2491],{},[1469,2492],{"alt":2493,"src":2494},"Writing metadata in Claude Code","/images/blog/musictechlab_blog_mtl-metadata-mcp-write.webp",[856,2496,2498],{"id":2497},"scanning-a-library","Scanning a library",[749,2500,2501],{},"This is where it gets powerful:",[1067,2503,2506],{"className":2504,"code":2505,"language":1072,"meta":1073},[1070],"> Scan ~/Music/demos and tell me which tracks are missing ISRC codes\n",[1075,2507,2505],{"__ignoreMap":1073},[1067,2509,2511],{"className":2262,"code":2510,"language":2264,"meta":1073,"style":1073},"{\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",[1075,2512,2513,2517,2537,2553,2567,2572,2592,2606,2638,2686,2691,2695,2714,2727,2741,2802,2808,2814],{"__ignoreMap":1073},[1560,2514,2515],{"class":1562,"line":1563},[1560,2516,2271],{"class":1874},[1560,2518,2519,2521,2524,2526,2528,2530,2533,2535],{"class":1562,"line":1570},[1560,2520,2276],{"class":1874},[1560,2522,2523],{"class":1902},"directory",[1560,2525,2282],{"class":1874},[1560,2527,2285],{"class":1874},[1560,2529,1875],{"class":1874},[1560,2531,2532],{"class":1812},"/Users/you/Music/demos",[1560,2534,2282],{"class":1874},[1560,2536,2295],{"class":1874},[1560,2538,2539,2541,2544,2546,2548,2551],{"class":1562,"line":1576},[1560,2540,2276],{"class":1874},[1560,2542,2543],{"class":1902},"total_files",[1560,2545,2282],{"class":1874},[1560,2547,2285],{"class":1874},[1560,2549,2550],{"class":2329}," 3",[1560,2552,2295],{"class":1874},[1560,2554,2555,2557,2560,2562,2564],{"class":1562,"line":1582},[1560,2556,2276],{"class":1874},[1560,2558,2559],{"class":1902},"files",[1560,2561,2282],{"class":1874},[1560,2563,2285],{"class":1874},[1560,2565,2566],{"class":1874}," [\n",[1560,2568,2569],{"class":1562,"line":1588},[1560,2570,2571],{"class":1874},"    {\n",[1560,2573,2574,2577,2579,2581,2583,2585,2588,2590],{"class":1562,"line":1594},[1560,2575,2576],{"class":1874},"      \"",[1560,2578,2279],{"class":1808},[1560,2580,2282],{"class":1874},[1560,2582,2285],{"class":1874},[1560,2584,1875],{"class":1874},[1560,2586,2587],{"class":1812},"idea-01.mp3",[1560,2589,2282],{"class":1874},[1560,2591,2295],{"class":1874},[1560,2593,2594,2596,2599,2601,2603],{"class":1562,"line":1599},[1560,2595,2576],{"class":1874},[1560,2597,2598],{"class":1808},"has_metadata",[1560,2600,2282],{"class":1874},[1560,2602,2285],{"class":1874},[1560,2604,2605],{"class":1874}," true,\n",[1560,2607,2608,2610,2613,2615,2617,2620,2622,2624,2626,2629,2631,2633,2635],{"class":1562,"line":1605},[1560,2609,2576],{"class":1874},[1560,2611,2612],{"class":1808},"fields_present",[1560,2614,2282],{"class":1874},[1560,2616,2285],{"class":1874},[1560,2618,2619],{"class":1874}," [",[1560,2621,2282],{"class":1874},[1560,2623,2402],{"class":1812},[1560,2625,2282],{"class":1874},[1560,2627,2628],{"class":1874},",",[1560,2630,1875],{"class":1874},[1560,2632,2422],{"class":1812},[1560,2634,2282],{"class":1874},[1560,2636,2637],{"class":1874},"],\n",[1560,2639,2640,2642,2645,2647,2649,2651,2653,2655,2657,2659,2661,2664,2666,2668,2670,2672,2674,2676,2678,2681,2683],{"class":1562,"line":1611},[1560,2641,2576],{"class":1874},[1560,2643,2644],{"class":1808},"fields_missing",[1560,2646,2282],{"class":1874},[1560,2648,2285],{"class":1874},[1560,2650,2619],{"class":1874},[1560,2652,2282],{"class":1874},[1560,2654,1325],{"class":1812},[1560,2656,2282],{"class":1874},[1560,2658,2628],{"class":1874},[1560,2660,1875],{"class":1874},[1560,2662,2663],{"class":1812},"date",[1560,2665,2282],{"class":1874},[1560,2667,2628],{"class":1874},[1560,2669,1875],{"class":1874},[1560,2671,2442],{"class":1812},[1560,2673,2282],{"class":1874},[1560,2675,2628],{"class":1874},[1560,2677,1875],{"class":1874},[1560,2679,2680],{"class":1812},"isrc",[1560,2682,2282],{"class":1874},[1560,2684,2685],{"class":1874},"]\n",[1560,2687,2688],{"class":1562,"line":1617},[1560,2689,2690],{"class":1874},"    },\n",[1560,2692,2693],{"class":1562,"line":1623},[1560,2694,2571],{"class":1874},[1560,2696,2697,2699,2701,2703,2705,2707,2710,2712],{"class":1562,"line":1692},[1560,2698,2576],{"class":1874},[1560,2700,2279],{"class":1808},[1560,2702,2282],{"class":1874},[1560,2704,2285],{"class":1874},[1560,2706,1875],{"class":1874},[1560,2708,2709],{"class":1812},"sketch.flac",[1560,2711,2282],{"class":1874},[1560,2713,2295],{"class":1874},[1560,2715,2716,2718,2720,2722,2724],{"class":1562,"line":1698},[1560,2717,2576],{"class":1874},[1560,2719,2598],{"class":1808},[1560,2721,2282],{"class":1874},[1560,2723,2285],{"class":1874},[1560,2725,2726],{"class":1874}," false,\n",[1560,2728,2730,2732,2734,2736,2738],{"class":1562,"line":2729},14,[1560,2731,2576],{"class":1874},[1560,2733,2612],{"class":1808},[1560,2735,2282],{"class":1874},[1560,2737,2285],{"class":1874},[1560,2739,2740],{"class":1874}," [],\n",[1560,2742,2744,2746,2748,2750,2752,2754,2756,2758,2760,2762,2764,2766,2768,2770,2772,2774,2776,2778,2780,2782,2784,2786,2788,2790,2792,2794,2796,2798,2800],{"class":1562,"line":2743},15,[1560,2745,2576],{"class":1874},[1560,2747,2644],{"class":1808},[1560,2749,2282],{"class":1874},[1560,2751,2285],{"class":1874},[1560,2753,2619],{"class":1874},[1560,2755,2282],{"class":1874},[1560,2757,2402],{"class":1812},[1560,2759,2282],{"class":1874},[1560,2761,2628],{"class":1874},[1560,2763,1875],{"class":1874},[1560,2765,2422],{"class":1812},[1560,2767,2282],{"class":1874},[1560,2769,2628],{"class":1874},[1560,2771,1875],{"class":1874},[1560,2773,1325],{"class":1812},[1560,2775,2282],{"class":1874},[1560,2777,2628],{"class":1874},[1560,2779,1875],{"class":1874},[1560,2781,2663],{"class":1812},[1560,2783,2282],{"class":1874},[1560,2785,2628],{"class":1874},[1560,2787,1875],{"class":1874},[1560,2789,2442],{"class":1812},[1560,2791,2282],{"class":1874},[1560,2793,2628],{"class":1874},[1560,2795,1875],{"class":1874},[1560,2797,2680],{"class":1812},[1560,2799,2282],{"class":1874},[1560,2801,2685],{"class":1874},[1560,2803,2805],{"class":1562,"line":2804},16,[1560,2806,2807],{"class":1874},"    }\n",[1560,2809,2811],{"class":1562,"line":2810},17,[1560,2812,2813],{"class":1874},"  ]\n",[1560,2815,2817],{"class":1562,"line":2816},18,[1560,2818,2463],{"class":1874},[749,2820,2821],{},[1469,2822],{"alt":2823,"src":2824},"Scanning a music library in Claude Code","/images/blog/musictechlab_blog_mtl-metadata-mcp-scan.webp",[749,2826,2827],{},"You can then follow up with batch commands:",[1067,2829,2832],{"className":2830,"code":2831,"language":1072,"meta":1073},[1070],"> Set ISRC codes USAB12300001 through USAB12300003 on each track in order\n",[1075,2833,2831],{"__ignoreMap":1073},[856,2835,1439],{"id":1438},[749,2837,2838],{},"Here are some real-world prompts you can try:",[1067,2840,2843],{"className":2841,"code":2842,"language":1072,"meta":1073},[1070],"> Read the metadata from all files in ~/Music/masters and show me a summary table\n",[1075,2844,2842],{"__ignoreMap":1073},[1067,2846,2849],{"className":2847,"code":2848,"language":1072,"meta":1073},[1070],"> Change the artist on demo-v3.mp3 from \"Unknown\" to \"Jane Doe\"\n",[1075,2850,2848],{"__ignoreMap":1073},[1067,2852,2855],{"className":2853,"code":2854,"language":1072,"meta":1073},[1070],"> Which files in ~/Music/releases have no genre tag?\n",[1075,2856,2854],{"__ignoreMap":1073},[1067,2858,2861],{"className":2859,"code":2860,"language":1072,"meta":1073},[1070],"> Copy the metadata from track-01.mp3 and apply it to track-01-remastered.mp3\n",[1075,2862,2860],{"__ignoreMap":1073},[1067,2864,2867],{"className":2865,"code":2866,"language":1072,"meta":1073},[1070],"> Strip all metadata from every file in ~/Music/stems\n",[1075,2868,2866],{"__ignoreMap":1073},[1067,2870,2873],{"className":2871,"code":2872,"language":1072,"meta":1073},[1070],"> Check if any FLAC files in ~/Music/archive are missing ISRC codes, then list them\n",[1075,2874,2872],{"__ignoreMap":1073},[1067,2876,2879],{"className":2877,"code":2878,"language":1072,"meta":1073},[1070],"> Set genre to \"Electronic\" on all MP3 files in ~/Music/ep that currently have no genre\n",[1075,2880,2878],{"__ignoreMap":1073},[1534,2882,2883],{},[749,2884,2885],{},"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.",[764,2887,1766],{"id":1765},[778,2889,2891,2893,2898],{"className":2890},[781,782,1770,784,785],[787,2892],{"description":1773,"icon":1774,"title":1775},[787,2894],{"description":2895,"icon":2896,"title":2897},"Cross-format audio tag handling (ID3v2, Vorbis comments).","i-lucide-music","mutagen",[787,2899],{"description":1783,"icon":1784,"title":1785},[749,2901,2902],{},"The entire codebase is under 200 lines of core logic, plus 14 automated tests.",[764,2904,1792],{"id":1791},[856,2906,1796],{"id":1795},[1067,2908,2910],{"className":1799,"code":2909,"language":1801,"meta":1073,"style":1073},"git clone https://github.com/musictechlab/mtl-metadata-mcp.git\ncd mtl-metadata-mcp\npoetry install\n",[1075,2911,2912,2921,2928],{"__ignoreMap":1073},[1560,2913,2914,2916,2918],{"class":1562,"line":1563},[1560,2915,1809],{"class":1808},[1560,2917,1813],{"class":1812},[1560,2919,2920],{"class":1812}," https://github.com/musictechlab/mtl-metadata-mcp.git\n",[1560,2922,2923,2925],{"class":1562,"line":1570},[1560,2924,1822],{"class":1821},[1560,2926,2927],{"class":1812}," mtl-metadata-mcp\n",[1560,2929,2930,2932],{"class":1562,"line":1576},[1560,2931,1830],{"class":1808},[1560,2933,1833],{"class":1812},[856,2935,1837],{"id":1836},[1067,2937,2939],{"className":1799,"code":2938,"language":1801,"meta":1073,"style":1073},"claude mcp add -s user mtl-metadata -- bash -c \"cd /path/to/mtl-metadata-mcp && poetry run python -m mtl_metadata_mcp\"\n",[1075,2940,2941],{"__ignoreMap":1073},[1560,2942,2943,2945,2947,2949,2951,2953,2956,2958,2960,2962,2964,2967],{"class":1562,"line":1563},[1560,2944,1847],{"class":1808},[1560,2946,1850],{"class":1812},[1560,2948,1853],{"class":1812},[1560,2950,1856],{"class":1812},[1560,2952,1859],{"class":1812},[1560,2954,2955],{"class":1812}," mtl-metadata",[1560,2957,1865],{"class":1812},[1560,2959,1868],{"class":1812},[1560,2961,1871],{"class":1812},[1560,2963,1875],{"class":1874},[1560,2965,2966],{"class":1812},"cd /path/to/mtl-metadata-mcp && poetry run python -m mtl_metadata_mcp",[1560,2968,1881],{"class":1874},[749,2970,2971],{},"Restart Claude Code, and the four metadata tools are available immediately.",[1534,2973,2974],{},[749,2975,1920,2976,1924,2978,1928],{},[1075,2977,1923],{},[1075,2979,2980],{},"mtl-metadata",[764,2982,1932],{"id":1931},[749,2984,1935],{},[778,2986,2988,2993,2998,3003],{"className":2987},[781,782,783,784,785],[787,2989],{"description":2990,"icon":2991,"title":2992},"Broadcast Wave Format (BWF) metadata for production and mastering workflows.","i-lucide-file-audio","WAV Support",[787,2994],{"description":2995,"icon":2996,"title":2997},"Embed and extract album artwork directly from audio files.","i-lucide-image","Cover Art",[787,2999],{"description":3000,"icon":3001,"title":3002},"A dedicated tool for applying metadata changes across entire folders in one go.","i-lucide-layers","Batch Operations",[787,3004],{"description":3005,"icon":3006,"title":3007},"Map metadata fields to DDEX ERN standards for catalog delivery workflows.","i-lucide-arrow-right-left","DDEX Field Mapping",[749,3009,1961,3010,1968],{},[772,3011,1967],{"href":1964,"rel":3012},[1966],[764,3014,743],{"id":1971},[749,3016,3017],{},"mtl-metadata-mcp is MIT licensed and available on GitHub:",[749,3019,3020],{},[772,3021,3024],{"href":3022,"rel":3023},"https://github.com/musictechlab/mtl-metadata-mcp",[1966],"github.com/musictechlab/mtl-metadata-mcp",[758,3026,3027],{},[749,3028,3029],{},"This project is experimental and in early development. Always back up your audio files before modifying metadata.",[749,3031,3032],{},"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.",[1991,3034,3035],{},"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":1073,"searchDepth":1570,"depth":1570,"links":3037},[3038,3039,3040,3041,3047,3048,3052,3053],{"id":766,"depth":1570,"text":767},{"id":816,"depth":1570,"text":817},{"id":2161,"depth":1570,"text":2162},{"id":1054,"depth":1570,"text":1055,"children":3042},[3043,3044,3045,3046],{"id":2246,"depth":1576,"text":2247},{"id":2475,"depth":1576,"text":2476},{"id":2497,"depth":1576,"text":2498},{"id":1438,"depth":1576,"text":1439},{"id":1765,"depth":1570,"text":1766},{"id":1791,"depth":1570,"text":1792,"children":3049},[3050,3051],{"id":1795,"depth":1576,"text":1796},{"id":1836,"depth":1576,"text":1837},{"id":1931,"depth":1570,"text":1932},{"id":1971,"depth":1570,"text":743},"2026-03-16T00:00:00.000Z",[3056,3059,3062,3064],{"question":3057,"answer":3058},"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":3060,"answer":3061},"What audio formats are supported?","MP3 (ID3v2 tags), FLAC (Vorbis comments), and OGG (Vorbis comments).",{"question":3063,"answer":2034},"How do I install mtl-metadata-mcp?",{"question":3065,"answer":3066},"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":3068},"/images/blog/musictechlab_blog_mtl-metadata-mcp.webp",{"enabled":2041,"items":3070},[3071,3073,3075,3077],{"text":3072,"icon":2896},"Read, write, scan, and clear audio metadata in MP3, FLAC, and OGG from natural language.",{"text":3074,"icon":805},"Directory scanning flags files with missing ISRC codes, genres, or other required tags.",{"text":3076,"icon":1774},"The entire codebase is under 200 lines of core logic with 14 automated tests.",{"text":3078,"icon":2053},"MIT licensed and open source; installs with Poetry and registers with Claude Code.",{},{"title":3081,"description":3082},"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.",[2059,2387,1971,2061,2062,3084,1023],"ID3","CP2xAS2yFqouqpSWlZPeceXbI6TnPGJVuje3o0ef4_Y",{"id":3087,"title":124,"authors":3088,"badge":3092,"body":3093,"category":2020,"client":2021,"date":4401,"description":4402,"extension":2024,"faq":4403,"featured":69,"featuredOrder":2021,"hidden":69,"image":4419,"keyTakeaways":4421,"meta":4433,"navigation":2041,"path":125,"seo":4434,"status":2021,"stem":126,"tags":4437,"teaser":2021,"__hash__":4441,"score":1576},"posts/blog/music-data/c2pa-in-music-mcp.md",[3089],{"name":3090,"to":739,"avatar":3091},"Mariusz Smenżyk",{"src":741},{"label":743,"color":744},{"type":746,"value":3094,"toc":4391},[3095,3120,3132,3136,3139,3142,3171,3174,3194,3198,3201,3565,3571,3575,3586,3621,3625,3632,3645,3653,3656,3662,3665,3736,3739,3749,3752,3758,3765,4017,4024,4030,4042,4049,4055,4066,4070,4073,4086,4092,4095,4099,4102,4244,4247,4251,4371,4374,4378,4381,4388],[749,3096,3097,3098,3103,3104,3109,3110,3115,3116,3119],{},"A ",[772,3099,3102],{"href":3100,"rel":3101},"https://www.linkedin.com/feed/update/urn:li:activity:7462923455760396288/",[1966],"LinkedIn post by Dawid Owczarek"," stopped my scroll: ",[772,3105,3108],{"href":3106,"rel":3107},"https://deepmind.google/technologies/lyria/",[1966],"Google Lyria"," is now embedding ",[772,3111,3114],{"href":3112,"rel":3113},"https://c2pa.org/",[1966],"C2PA"," manifests inside the MP3s you download from it. I went and checked, and yes, the file really does contain a cryptographically signed manifest declaring who made the track, what tool produced it, and what watermark was applied. That sent me down a rabbit hole, and this post is the result. The headline, though, is not Lyria. The headline is ",[753,3117,3118],{},"C2PA itself, finally arriving in audio",".",[749,3121,3122,3123,3127,3128,3131],{},"If you work in music, you have spent years living with ISRC, ISWC, ISNI, and DDEX. Those standards answer the question ",[3124,3125,3126],"em",{},"who owns this recording",". C2PA answers a different question: ",[3124,3129,3130],{},"who created it, and how",". That is the layer music has been missing, and the layer AI makes urgent.",[764,3133,3135],{"id":3134},"what-c2pa-actually-is","What C2PA actually is",[749,3137,3138],{},"C2PA stands for the Coalition for Content Provenance and Authenticity. It is a JDF-hosted open standard, founded in 2021 by Adobe, Microsoft, Intel, BBC, and others, with Google joining as a steering member shortly after. The spec defines a binary container that lives inside a media file and carries a cryptographically signed history of how that file came to be.",[749,3140,3141],{},"A C2PA manifest contains:",[3143,3144,3145,3152,3159,3165],"ul",{},[3146,3147,3097,3148,3151],"li",{},[753,3149,3150],{},"claim generator"," identifying the software that created the manifest",[3146,3153,3154,3155,3158],{},"A list of ",[753,3156,3157],{},"assertions"," (actions, hashes, training data declarations, soft bindings)",[3146,3160,3161,3164],{},[753,3162,3163],{},"Ingredients"," describing source assets used as inputs",[3146,3166,3097,3167,3170],{},[753,3168,3169],{},"signature"," that ties everything to a known certificate issuer",[749,3172,3173],{},"The whole thing is designed to be self-contained and tamper-evident. You can rename a file, strip its ID3 tags, or re-encode the audio, and the manifest either travels with the file intact or breaks in a detectable way.",[758,3175,3176],{},[749,3177,3178,3179,3184,3185,3189,3190,3193],{},"C2PA does not prove a file is original, copyright-free, or ",[772,3180,3183],{"href":3181,"rel":3182},"https://verifiedhumancert.com/",[1966],"human-made",". It proves a verifiable chain of declarations: this software signed this claim, on this date, about this content. That distinction is the foundation everything else builds on. For the human-made angle specifically, separate efforts like ",[772,3186,3188],{"href":3181,"rel":3187},[1966],"Verified Human Cert"," issue cryptographic certifications that a track was created by people, not AI — a complementary layer to C2PA's provenance trail. We open-sourced ",[772,3191,3192],{"href":591},"an MCP server for the VHC registry"," earlier this year, if you want to query it from Claude alongside this C2PA MCP.",[764,3195,3197],{"id":3196},"what-google-lyria-proved","What Google Lyria proved",[749,3199,3200],{},"The clearest sign that audio C2PA has crossed the line from spec to product is what Google shipped in Lyria. When you download a Lyria-generated MP3, the file contains a fully populated C2PA manifest. Here is a snippet from a track I generated, abbreviated for clarity:",[1067,3202,3205],{"className":2262,"code":3203,"filename":3204,"language":2264,"meta":1073,"style":1073},"{\n  \"active_manifest\": \"urn:c2pa:80faaddf-fe27-1e7d-0ce5-4a70eeba2dd1\",\n  \"manifests\": {\n    \"urn:c2pa:80faaddf-fe27-1e7d-0ce5-4a70eeba2dd1\": {\n      \"claim_generator_info\": [\n        {\n          \"name\": \"Google C2PA Core Generator Library\",\n          \"version\": \"916434528:916944653\"\n        }\n      ],\n      \"assertions\": [\n        {\n          \"label\": \"c2pa.actions.v2\",\n          \"data\": {\n            \"actions\": [\n              {\n                \"action\": \"c2pa.created\",\n                \"digitalSourceType\": \"http://cv.iptc.org/newscodes/digitalsourcetype/trainedAlgorithmicMedia\",\n                \"description\": \"Created by Google Generative AI.\"\n              },\n              {\n                \"action\": \"c2pa.edited\",\n                \"digitalSourceType\": \"http://cv.iptc.org/newscodes/digitalsourcetype/trainedAlgorithmicMedia\",\n                \"description\": \"Applied imperceptible SynthID watermark.\"\n              }\n            ]\n          }\n        }\n      ]\n    }\n  }\n}\n","lyria-manifest.json",[1075,3206,3207,3211,3231,3244,3256,3269,3274,3296,3314,3319,3324,3336,3340,3360,3373,3388,3393,3414,3434,3453,3459,3464,3484,3503,3521,3527,3533,3539,3544,3550,3555,3560],{"__ignoreMap":1073},[1560,3208,3209],{"class":1562,"line":1563},[1560,3210,2271],{"class":1874},[1560,3212,3213,3215,3218,3220,3222,3224,3227,3229],{"class":1562,"line":1570},[1560,3214,2276],{"class":1874},[1560,3216,3217],{"class":1902},"active_manifest",[1560,3219,2282],{"class":1874},[1560,3221,2285],{"class":1874},[1560,3223,1875],{"class":1874},[1560,3225,3226],{"class":1812},"urn:c2pa:80faaddf-fe27-1e7d-0ce5-4a70eeba2dd1",[1560,3228,2282],{"class":1874},[1560,3230,2295],{"class":1874},[1560,3232,3233,3235,3238,3240,3242],{"class":1562,"line":1576},[1560,3234,2276],{"class":1874},[1560,3236,3237],{"class":1902},"manifests",[1560,3239,2282],{"class":1874},[1560,3241,2285],{"class":1874},[1560,3243,2394],{"class":1874},[1560,3245,3246,3248,3250,3252,3254],{"class":1562,"line":1582},[1560,3247,2399],{"class":1874},[1560,3249,3226],{"class":1808},[1560,3251,2282],{"class":1874},[1560,3253,2285],{"class":1874},[1560,3255,2394],{"class":1874},[1560,3257,3258,3260,3263,3265,3267],{"class":1562,"line":1588},[1560,3259,2576],{"class":1874},[1560,3261,3262],{"class":2329},"claim_generator_info",[1560,3264,2282],{"class":1874},[1560,3266,2285],{"class":1874},[1560,3268,2566],{"class":1874},[1560,3270,3271],{"class":1562,"line":1594},[1560,3272,3273],{"class":1874},"        {\n",[1560,3275,3276,3279,3283,3285,3287,3289,3292,3294],{"class":1562,"line":1599},[1560,3277,3278],{"class":1874},"          \"",[1560,3280,3282],{"class":3281},"swJcz","name",[1560,3284,2282],{"class":1874},[1560,3286,2285],{"class":1874},[1560,3288,1875],{"class":1874},[1560,3290,3291],{"class":1812},"Google C2PA Core Generator Library",[1560,3293,2282],{"class":1874},[1560,3295,2295],{"class":1874},[1560,3297,3298,3300,3303,3305,3307,3309,3312],{"class":1562,"line":1605},[1560,3299,3278],{"class":1874},[1560,3301,3302],{"class":3281},"version",[1560,3304,2282],{"class":1874},[1560,3306,2285],{"class":1874},[1560,3308,1875],{"class":1874},[1560,3310,3311],{"class":1812},"916434528:916944653",[1560,3313,1881],{"class":1874},[1560,3315,3316],{"class":1562,"line":1611},[1560,3317,3318],{"class":1874},"        }\n",[1560,3320,3321],{"class":1562,"line":1617},[1560,3322,3323],{"class":1874},"      ],\n",[1560,3325,3326,3328,3330,3332,3334],{"class":1562,"line":1623},[1560,3327,2576],{"class":1874},[1560,3329,3157],{"class":2329},[1560,3331,2282],{"class":1874},[1560,3333,2285],{"class":1874},[1560,3335,2566],{"class":1874},[1560,3337,3338],{"class":1562,"line":1692},[1560,3339,3273],{"class":1874},[1560,3341,3342,3344,3347,3349,3351,3353,3356,3358],{"class":1562,"line":1698},[1560,3343,3278],{"class":1874},[1560,3345,3346],{"class":3281},"label",[1560,3348,2282],{"class":1874},[1560,3350,2285],{"class":1874},[1560,3352,1875],{"class":1874},[1560,3354,3355],{"class":1812},"c2pa.actions.v2",[1560,3357,2282],{"class":1874},[1560,3359,2295],{"class":1874},[1560,3361,3362,3364,3367,3369,3371],{"class":1562,"line":2729},[1560,3363,3278],{"class":1874},[1560,3365,3366],{"class":3281},"data",[1560,3368,2282],{"class":1874},[1560,3370,2285],{"class":1874},[1560,3372,2394],{"class":1874},[1560,3374,3375,3378,3382,3384,3386],{"class":1562,"line":2743},[1560,3376,3377],{"class":1874},"            \"",[1560,3379,3381],{"class":3380},"su27w","actions",[1560,3383,2282],{"class":1874},[1560,3385,2285],{"class":1874},[1560,3387,2566],{"class":1874},[1560,3389,3390],{"class":1562,"line":2804},[1560,3391,3392],{"class":1874},"              {\n",[1560,3394,3395,3398,3401,3403,3405,3407,3410,3412],{"class":1562,"line":2810},[1560,3396,3397],{"class":1874},"                \"",[1560,3399,3400],{"class":1821},"action",[1560,3402,2282],{"class":1874},[1560,3404,2285],{"class":1874},[1560,3406,1875],{"class":1874},[1560,3408,3409],{"class":1812},"c2pa.created",[1560,3411,2282],{"class":1874},[1560,3413,2295],{"class":1874},[1560,3415,3416,3418,3421,3423,3425,3427,3430,3432],{"class":1562,"line":2816},[1560,3417,3397],{"class":1874},[1560,3419,3420],{"class":1821},"digitalSourceType",[1560,3422,2282],{"class":1874},[1560,3424,2285],{"class":1874},[1560,3426,1875],{"class":1874},[1560,3428,3429],{"class":1812},"http://cv.iptc.org/newscodes/digitalsourcetype/trainedAlgorithmicMedia",[1560,3431,2282],{"class":1874},[1560,3433,2295],{"class":1874},[1560,3435,3437,3439,3442,3444,3446,3448,3451],{"class":1562,"line":3436},19,[1560,3438,3397],{"class":1874},[1560,3440,3441],{"class":1821},"description",[1560,3443,2282],{"class":1874},[1560,3445,2285],{"class":1874},[1560,3447,1875],{"class":1874},[1560,3449,3450],{"class":1812},"Created by Google Generative AI.",[1560,3452,1881],{"class":1874},[1560,3454,3456],{"class":1562,"line":3455},20,[1560,3457,3458],{"class":1874},"              },\n",[1560,3460,3462],{"class":1562,"line":3461},21,[1560,3463,3392],{"class":1874},[1560,3465,3467,3469,3471,3473,3475,3477,3480,3482],{"class":1562,"line":3466},22,[1560,3468,3397],{"class":1874},[1560,3470,3400],{"class":1821},[1560,3472,2282],{"class":1874},[1560,3474,2285],{"class":1874},[1560,3476,1875],{"class":1874},[1560,3478,3479],{"class":1812},"c2pa.edited",[1560,3481,2282],{"class":1874},[1560,3483,2295],{"class":1874},[1560,3485,3487,3489,3491,3493,3495,3497,3499,3501],{"class":1562,"line":3486},23,[1560,3488,3397],{"class":1874},[1560,3490,3420],{"class":1821},[1560,3492,2282],{"class":1874},[1560,3494,2285],{"class":1874},[1560,3496,1875],{"class":1874},[1560,3498,3429],{"class":1812},[1560,3500,2282],{"class":1874},[1560,3502,2295],{"class":1874},[1560,3504,3506,3508,3510,3512,3514,3516,3519],{"class":1562,"line":3505},24,[1560,3507,3397],{"class":1874},[1560,3509,3441],{"class":1821},[1560,3511,2282],{"class":1874},[1560,3513,2285],{"class":1874},[1560,3515,1875],{"class":1874},[1560,3517,3518],{"class":1812},"Applied imperceptible SynthID watermark.",[1560,3520,1881],{"class":1874},[1560,3522,3524],{"class":1562,"line":3523},25,[1560,3525,3526],{"class":1874},"              }\n",[1560,3528,3530],{"class":1562,"line":3529},26,[1560,3531,3532],{"class":1874},"            ]\n",[1560,3534,3536],{"class":1562,"line":3535},27,[1560,3537,3538],{"class":1874},"          }\n",[1560,3540,3542],{"class":1562,"line":3541},28,[1560,3543,3318],{"class":1874},[1560,3545,3547],{"class":1562,"line":3546},29,[1560,3548,3549],{"class":1874},"      ]\n",[1560,3551,3553],{"class":1562,"line":3552},30,[1560,3554,2807],{"class":1874},[1560,3556,3558],{"class":1562,"line":3557},31,[1560,3559,2458],{"class":1874},[1560,3561,3563],{"class":1562,"line":3562},32,[1560,3564,2463],{"class":1874},[749,3566,3567,3568,3570],{},"This is a real-world example of every piece of the spec working in audio: claim generator, signed actions, IPTC ",[1075,3569,3420],{}," URI for AI disclosure, and a SynthID watermark recorded as a c2pa.edited action. The whole manifest is signed by Google LLC.",[764,3572,3574],{"id":3573},"why-c2pa-matters-for-the-music-industry","Why C2PA matters for the music industry",[749,3576,3577,3578,3581,3582,3585],{},"Music has spent years building IDs and registries to answer ",[3124,3579,3580],{},"ownership",". C2PA layers on top to answer ",[3124,3583,3584],{},"origin",". The combination changes several workflows materially.",[778,3587,3589,3597,3605,3613],{"className":3588},[781,782,783,784,785],[787,3590,3594],{"description":3591,"icon":3592,"title":3593},"A signed declaration of how a track was created is a better input than after-the-fact AI detection.","i-lucide-receipt","Rights and royalties",[749,3595,3596],{},"PROs, labels, and rights administrators are scrambling to define how AI-generated tracks fit existing royalty flows. A C2PA manifest gives them deterministic input rather than a probabilistic classifier verdict.",[787,3598,3602],{"description":3599,"icon":3600,"title":3601},"Streaming platforms need machine-readable AI flags for listener disclosure and licensing math.","i-lucide-radio","DSP compliance",[749,3603,3604],{},"Apple Music, Spotify, Deezer, and others increasingly need to badge or filter AI content. A preserved C2PA manifest is a verifiable trigger they can rely on.",[787,3606,3610],{"description":3607,"icon":3608,"title":3609},"A C2PA check at delivery time sits naturally alongside DDEX validation.","i-lucide-upload","Distributor ingestion checks",[749,3611,3612],{},"If a track claims to be a human performance but the manifest says trainedAlgorithmicMedia, that is now a deterministic flag, not a guess.",[787,3614,3618],{"description":3615,"icon":3616,"title":3617},"AI music libraries can require C2PA on every clip and reject unsigned submissions.","i-lucide-library","Catalog hygiene for AI",[749,3619,3620],{},"The cost of attaching a manifest at generation time is near zero. The cost of cleaning up an unsigned catalog later is enormous.",[764,3622,3624],{"id":3623},"reading-c2pa-in-plain-english-with-claude","Reading C2PA in plain English with Claude",[749,3626,3627,3628,3631],{},"The official tool for reading C2PA is the Rust ",[1075,3629,3630],{},"c2patool"," binary. It works, but the output is raw JSON, and few people in the music industry will install a Rust CLI to inspect a download.",[749,3633,3634,3635,3640,3641,3644],{},"So we built ",[772,3636,3639],{"href":3637,"rel":3638},"https://github.com/musictechlab/mtl-c2pa-mcp",[1966],"mtl-c2pa-mcp",", an open-source MCP server that wraps the official ",[1075,3642,3643],{},"c2pa-python"," library and exposes it as tools inside Claude Code.",[1534,3646,3647],{},[749,3648,3649,3650,3652],{},"The MCP runs locally. Your audio files never leave your machine. ",[1075,3651,3643],{}," is the official Adobe Rust binding, the same engine that powers the c2patool CLI.",[749,3654,3655],{},"The server exposes seven tools:",[1067,3657,3660],{"className":3658,"code":3659,"language":1072,"meta":1073},[1070],"c2pa_summary       Human-friendly overview: generator, AI flag, actions, watermark, signature\nc2pa_read          Full raw manifest store\nc2pa_assertions    All assertions from the active manifest\nc2pa_ingredients   Source assets used to create this file\nc2pa_verify        Signature issuer, validation state, failures\nc2pa_scan          Audit a folder: which files carry C2PA, which are AI-generated\nc2pa_info          Library version and supported MIME types\n",[1075,3661,3659],{"__ignoreMap":1073},[749,3663,3664],{},"Install once:",[1067,3666,3668],{"className":1799,"code":3667,"language":1801,"meta":1073,"style":1073},"git clone https://github.com/musictechlab/mtl-c2pa-mcp.git\ncd mtl-c2pa-mcp\npoetry install\nclaude mcp add -s user mtl-c2pa -- poetry --directory $(pwd) run python -m mtl_c2pa\n",[1075,3669,3670,3679,3686,3692],{"__ignoreMap":1073},[1560,3671,3672,3674,3676],{"class":1562,"line":1563},[1560,3673,1809],{"class":1808},[1560,3675,1813],{"class":1812},[1560,3677,3678],{"class":1812}," https://github.com/musictechlab/mtl-c2pa-mcp.git\n",[1560,3680,3681,3683],{"class":1562,"line":1570},[1560,3682,1822],{"class":1821},[1560,3684,3685],{"class":1812}," mtl-c2pa-mcp\n",[1560,3687,3688,3690],{"class":1562,"line":1576},[1560,3689,1830],{"class":1808},[1560,3691,1833],{"class":1812},[1560,3693,3694,3696,3698,3700,3702,3704,3707,3709,3712,3715,3718,3721,3724,3727,3730,3733],{"class":1562,"line":1582},[1560,3695,1847],{"class":1808},[1560,3697,1850],{"class":1812},[1560,3699,1853],{"class":1812},[1560,3701,1856],{"class":1812},[1560,3703,1859],{"class":1812},[1560,3705,3706],{"class":1812}," mtl-c2pa",[1560,3708,1865],{"class":1812},[1560,3710,3711],{"class":1812}," poetry",[1560,3713,3714],{"class":1812}," --directory",[1560,3716,3717],{"class":1874}," $(",[1560,3719,3720],{"class":1821},"pwd",[1560,3722,3723],{"class":1874},")",[1560,3725,3726],{"class":1812}," run",[1560,3728,3729],{"class":1812}," python",[1560,3731,3732],{"class":1812}," -m",[1560,3734,3735],{"class":1812}," mtl_c2pa\n",[749,3737,3738],{},"Then ask Claude in plain English:",[3740,3741,3742],"blockquote",{},[749,3743,3744,3745,3748],{},"\"What does the C2PA manifest in ",[1075,3746,3747],{},"~/Downloads/track.mp3"," say?\"",[749,3750,3751],{},"Claude finds the file, calls the MCP, and renders the manifest as a clean table:",[749,3753,3754],{},[1469,3755],{"alt":3756,"src":3757},"C2PA manifest summary rendered in Claude Code for a Lyria-generated MP3","/images/blog/musictechlab_blog_c2pa-in-music-mcp-claude-example.webp",[749,3759,3760,3761,3764],{},"Under the hood, that's the JSON the ",[1075,3762,3763],{},"c2pa_summary"," tool returns:",[1067,3766,3769],{"className":2262,"code":3767,"filename":3768,"language":2264,"meta":1073,"style":1073},"{\n  \"file\": \"/Users/you/Downloads/track.mp3\",\n  \"generator\": {\n    \"name\": \"Google C2PA Core Generator Library\",\n    \"version\": \"916434528:916944653\"\n  },\n  \"is_ai_generated\": true,\n  \"digital_source_types\": [\n    \"http://cv.iptc.org/newscodes/digitalsourcetype/trainedAlgorithmicMedia\"\n  ],\n  \"actions\": [\n    {\"action\": \"c2pa.created\", \"description\": \"Created by Google Generative AI.\"},\n    {\"action\": \"c2pa.edited\",  \"description\": \"Applied imperceptible SynthID watermark.\"}\n  ],\n  \"signature_issuer\": \"Google LLC\",\n  \"validation\": \"valid\"\n}\n","c2pa_summary output",[1075,3770,3771,3775,3794,3807,3825,3841,3846,3859,3872,3880,3885,3897,3935,3971,3975,3995,4013],{"__ignoreMap":1073},[1560,3772,3773],{"class":1562,"line":1563},[1560,3774,2271],{"class":1874},[1560,3776,3777,3779,3781,3783,3785,3787,3790,3792],{"class":1562,"line":1570},[1560,3778,2276],{"class":1874},[1560,3780,2279],{"class":1902},[1560,3782,2282],{"class":1874},[1560,3784,2285],{"class":1874},[1560,3786,1875],{"class":1874},[1560,3788,3789],{"class":1812},"/Users/you/Downloads/track.mp3",[1560,3791,2282],{"class":1874},[1560,3793,2295],{"class":1874},[1560,3795,3796,3798,3801,3803,3805],{"class":1562,"line":1576},[1560,3797,2276],{"class":1874},[1560,3799,3800],{"class":1902},"generator",[1560,3802,2282],{"class":1874},[1560,3804,2285],{"class":1874},[1560,3806,2394],{"class":1874},[1560,3808,3809,3811,3813,3815,3817,3819,3821,3823],{"class":1562,"line":1582},[1560,3810,2399],{"class":1874},[1560,3812,3282],{"class":1808},[1560,3814,2282],{"class":1874},[1560,3816,2285],{"class":1874},[1560,3818,1875],{"class":1874},[1560,3820,3291],{"class":1812},[1560,3822,2282],{"class":1874},[1560,3824,2295],{"class":1874},[1560,3826,3827,3829,3831,3833,3835,3837,3839],{"class":1562,"line":1588},[1560,3828,2399],{"class":1874},[1560,3830,3302],{"class":1808},[1560,3832,2282],{"class":1874},[1560,3834,2285],{"class":1874},[1560,3836,1875],{"class":1874},[1560,3838,3311],{"class":1812},[1560,3840,1881],{"class":1874},[1560,3842,3843],{"class":1562,"line":1594},[1560,3844,3845],{"class":1874},"  },\n",[1560,3847,3848,3850,3853,3855,3857],{"class":1562,"line":1599},[1560,3849,2276],{"class":1874},[1560,3851,3852],{"class":1902},"is_ai_generated",[1560,3854,2282],{"class":1874},[1560,3856,2285],{"class":1874},[1560,3858,2605],{"class":1874},[1560,3860,3861,3863,3866,3868,3870],{"class":1562,"line":1605},[1560,3862,2276],{"class":1874},[1560,3864,3865],{"class":1902},"digital_source_types",[1560,3867,2282],{"class":1874},[1560,3869,2285],{"class":1874},[1560,3871,2566],{"class":1874},[1560,3873,3874,3876,3878],{"class":1562,"line":1611},[1560,3875,2399],{"class":1874},[1560,3877,3429],{"class":1812},[1560,3879,1881],{"class":1874},[1560,3881,3882],{"class":1562,"line":1617},[1560,3883,3884],{"class":1874},"  ],\n",[1560,3886,3887,3889,3891,3893,3895],{"class":1562,"line":1623},[1560,3888,2276],{"class":1874},[1560,3890,3381],{"class":1902},[1560,3892,2282],{"class":1874},[1560,3894,2285],{"class":1874},[1560,3896,2566],{"class":1874},[1560,3898,3899,3902,3904,3906,3908,3910,3912,3914,3916,3918,3920,3922,3924,3926,3928,3930,3932],{"class":1562,"line":1692},[1560,3900,3901],{"class":1874},"    {",[1560,3903,2282],{"class":1874},[1560,3905,3400],{"class":1808},[1560,3907,2282],{"class":1874},[1560,3909,2285],{"class":1874},[1560,3911,1875],{"class":1874},[1560,3913,3409],{"class":1812},[1560,3915,2282],{"class":1874},[1560,3917,2628],{"class":1874},[1560,3919,1875],{"class":1874},[1560,3921,3441],{"class":1808},[1560,3923,2282],{"class":1874},[1560,3925,2285],{"class":1874},[1560,3927,1875],{"class":1874},[1560,3929,3450],{"class":1812},[1560,3931,2282],{"class":1874},[1560,3933,3934],{"class":1874},"},\n",[1560,3936,3937,3939,3941,3943,3945,3947,3949,3951,3953,3955,3957,3959,3961,3963,3965,3967,3969],{"class":1562,"line":1698},[1560,3938,3901],{"class":1874},[1560,3940,2282],{"class":1874},[1560,3942,3400],{"class":1808},[1560,3944,2282],{"class":1874},[1560,3946,2285],{"class":1874},[1560,3948,1875],{"class":1874},[1560,3950,3479],{"class":1812},[1560,3952,2282],{"class":1874},[1560,3954,2628],{"class":1874},[1560,3956,2276],{"class":1874},[1560,3958,3441],{"class":1808},[1560,3960,2282],{"class":1874},[1560,3962,2285],{"class":1874},[1560,3964,1875],{"class":1874},[1560,3966,3518],{"class":1812},[1560,3968,2282],{"class":1874},[1560,3970,2463],{"class":1874},[1560,3972,3973],{"class":1562,"line":2729},[1560,3974,3884],{"class":1874},[1560,3976,3977,3979,3982,3984,3986,3988,3991,3993],{"class":1562,"line":2743},[1560,3978,2276],{"class":1874},[1560,3980,3981],{"class":1902},"signature_issuer",[1560,3983,2282],{"class":1874},[1560,3985,2285],{"class":1874},[1560,3987,1875],{"class":1874},[1560,3989,3990],{"class":1812},"Google LLC",[1560,3992,2282],{"class":1874},[1560,3994,2295],{"class":1874},[1560,3996,3997,3999,4002,4004,4006,4008,4011],{"class":1562,"line":2804},[1560,3998,2276],{"class":1874},[1560,4000,4001],{"class":1902},"validation",[1560,4003,2282],{"class":1874},[1560,4005,2285],{"class":1874},[1560,4007,1875],{"class":1874},[1560,4009,4010],{"class":1812},"valid",[1560,4012,1881],{"class":1874},[1560,4014,4015],{"class":1562,"line":2810},[1560,4016,2463],{"class":1874},[749,4018,4019,4020,4023],{},"Ask for the full manifest store and ",[1075,4021,4022],{},"c2pa_read"," returns everything, including the signing certificate metadata, claim version, and validation status:",[749,4025,4026],{},[1469,4027],{"alt":4028,"src":4029},"Raw C2PA manifest JSON returned by c2pa_read in Claude Code","/images/blog/musictechlab_blog_c2pa-in-music-mcp-raw-json.webp",[758,4031,4032],{},[749,4033,4034,4035,4038,4039,4041],{},"Notice the ",[1075,4036,4037],{},"signingCredential.untrusted"," flag in that output. The manifest itself is structurally valid, but Google's signing certificate is not yet in the default trust list shipped with ",[1075,4040,3643],{},". That is not a forgery signal, just a reminder that trust lists are a separate, evolving piece of the C2PA infrastructure. Compliance workflows have to pin the trust anchors they accept.",[749,4043,4044,4045,4048],{},"For an A&R team auditing a batch of demos, ",[1075,4046,4047],{},"c2pa_scan"," walks a directory and reports which files carry a manifest and which are flagged as AI-generated. No spreadsheet, no manual triage:",[749,4050,4051],{},[1469,4052],{"alt":4053,"src":4054},"C2PA scan of a Music folder showing which tracks carry a manifest and which are AI-generated","/images/blog/musictechlab_blog_c2pa-in-music-mcp-scan-example.webp",[749,4056,4057,4058,4061,4062,4065],{},"In the screenshot, four MP3s in ",[1075,4059,4060],{},"~/Music",". One (the Lyria-generated track) carries a Google-signed C2PA manifest flagged as ",[1075,4063,4064],{},"trainedAlgorithmicMedia",". The other three are unsigned. 25% coverage, with a clear AI-or-not column.",[764,4067,4069],{"id":4068},"whats-next","What's next",[749,4071,4072],{},"The MCP solves the problem for developers and anyone comfortable in Claude Code. But most of the people who actually need to read a C2PA manifest, A&R scouts, label managers, rights administrators, music lawyers, journalists, will never open a terminal. Raw JSON is not a deliverable for them.",[749,4074,4075,4076,4079,4080,4085],{},"So phase two is a ",[753,4077,4078],{},"visual C2PA translator"," at musictechlab.io: drop a file in the browser, see the manifest rendered in plain English (Who, What, When, How), with a trust score and a JSON export for the technical readers who want it. Everything client-side, nothing uploaded, similar to what ",[772,4081,4084],{"href":4082,"rel":4083},"https://melchersystem.com/c2pa-content-credentials-translator/",[1966],"melchersystem.com"," has done for images, but tuned for audio and the music industry's specific provenance questions.",[4087,4088,4089],"warning",{},[749,4090,4091],{},"C2PA still evolves: signing trust lists change, and tooling support varies between vendors. Treat manifests as evidence, not as legal proof. The MCP and the upcoming translator are inspection tools, not compliance certifications.",[749,4093,4094],{},"If you produce, distribute, or license music, this is the moment to start paying attention. C2PA is no longer a slide in a keynote. It is a thing you can grep for in a downloads folder.",[764,4096,4098],{"id":4097},"who-already-implements-c2pa","Who already implements C2PA",[749,4100,4101],{},"The list of organizations shipping C2PA in production is no longer short. As of 2026 the coalition counts over 6,000 members and affiliates, and the implementation list spans cameras, AI services, creative tools, and social platforms.",[778,4103,4105,4136,4179,4204],{"className":4104},[781,782,783,784,785],[787,4106,4110],{"description":4107,"icon":4108,"title":4109},"Sign generated images, audio, and video with C2PA at creation time.","i-lucide-sparkles","AI generators",[3143,4111,4112,4118,4124,4130],{},[3146,4113,4114,4117],{},[753,4115,4116],{},"Google"," — Lyria (audio), Imagen (images), Veo (video), all signed with Google's C2PA generator and paired with SynthID",[3146,4119,4120,4123],{},[753,4121,4122],{},"OpenAI"," — DALL·E 3 and Sora output embeds C2PA, with layered SynthID and public verification",[3146,4125,4126,4129],{},[753,4127,4128],{},"Adobe Firefly"," — every generated asset carries Content Credentials by default",[3146,4131,4132,4135],{},[753,4133,4134],{},"Microsoft Designer / Bing Image Creator"," — automatic AI labeling via C2PA",[787,4137,4141],{"description":4138,"icon":4139,"title":4140},"Hardware-backed signing at capture time. Provenance starts at the sensor.","i-lucide-camera","Cameras",[3143,4142,4143,4149,4155,4161,4167],{},[3146,4144,4145,4148],{},[753,4146,4147],{},"Leica M11-P"," — first commercial camera to ship C2PA at capture (2023)",[3146,4150,4151,4154],{},[753,4152,4153],{},"Sony Alpha 1 II, A9 III, PXW-Z300"," — stills and professional video",[3146,4156,4157,4160],{},[753,4158,4159],{},"Nikon Z6 III, Z9"," — firmware-enabled C2PA",[3146,4162,4163,4166],{},[753,4164,4165],{},"Canon EOS R3"," — pilot program",[3146,4168,4169,1414,4172,1414,4175,4178],{},[753,4170,4171],{},"Fujifilm",[753,4173,4174],{},"Samsung Galaxy S25",[753,4176,4177],{},"Google Pixel 10"," — mobile + hardware-backed signing",[787,4180,4184],{"description":4181,"icon":4182,"title":4183},"Maintain Content Credentials through the editing chain, not just at capture.","i-lucide-edit","Creative tools",[3143,4185,4186,4192,4198],{},[3146,4187,4188,4191],{},[753,4189,4190],{},"Adobe Creative Cloud"," — Photoshop, Lightroom, Premiere Pro, After Effects all preserve and extend C2PA manifests",[3146,4193,4194,4197],{},[753,4195,4196],{},"Truepic"," — capture and verification SDK used by news and insurance",[3146,4199,4200,4203],{},[753,4201,4202],{},"Photo Mechanic"," — sidecar workflow for photojournalists",[787,4205,4209],{"description":4206,"icon":4207,"title":4208},"Display Content Credentials to viewers, or use them for ingest checks.","i-lucide-share-2","Platforms and publishers",[3143,4210,4211,4217,4223,4229],{},[3146,4212,4213,4216],{},[753,4214,4215],{},"LinkedIn"," — shows a \"CR\" icon on images carrying Content Credentials",[3146,4218,4219,4222],{},[753,4220,4221],{},"TikTok"," — labels AI-generated content using C2PA in partnership with the CAI",[3146,4224,4225,4228],{},[753,4226,4227],{},"Meta"," — announced labeling of AI content via C2PA across Facebook, Instagram, Threads",[3146,4230,4231,1414,4234,1414,4237,1414,4240,4243],{},[753,4232,4233],{},"BBC",[753,4235,4236],{},"Reuters",[753,4238,4239],{},"AP",[753,4241,4242],{},"New York Times"," — early newsroom adoption for source attribution",[749,4245,4246],{},"The music side is the newest entry in this lineup. Google Lyria is the first major AI music service to ship C2PA in downloadable MP3s, but the infrastructure (signing libraries, trust lists, viewer apps) is already mature on the image and video side. That groundwork is what makes audio adoption practical now rather than years away.",[764,4248,4250],{"id":4249},"resources","Resources",[778,4252,4254,4284,4321,4350],{"className":4253},[781,782,783,784,785],[787,4255,4259],{"description":4256,"icon":2112,"title":4257,"target":4258,"to":3112},"Read the standard itself and the consumer-facing brand layer.","Official spec and consortium","_blank",[3143,4260,4261,4268,4276],{},[3146,4262,4263,4267],{},[772,4264,4266],{"href":3112,"rel":4265},[1966],"c2pa.org"," — the open standard, governed by the JDF",[3146,4269,4270,4275],{},[772,4271,4274],{"href":4272,"rel":4273},"https://contentcredentials.org/",[1966],"contentcredentials.org"," — Adobe-led consumer-facing brand",[3146,4277,4278,4283],{},[772,4279,4282],{"href":4280,"rel":4281},"https://contentauthenticity.org/",[1966],"Content Authenticity Initiative"," — the founding coalition",[787,4285,4289],{"description":4286,"icon":1774,"title":4287,"target":4258,"to":4288},"Reference implementations and bindings for adding C2PA to your stack.","Open-source tooling","https://github.com/contentauth",[3143,4290,4291,4299,4306,4314],{},[3146,4292,4293,4298],{},[772,4294,4297],{"href":4295,"rel":4296},"https://github.com/contentauth/c2pa-rs",[1966],"c2pa-rs"," — Rust reference implementation",[3146,4300,4301,4305],{},[772,4302,3643],{"href":4303,"rel":4304},"https://github.com/contentauth/c2pa-python",[1966]," — official Python binding (used by our MCP)",[3146,4307,4308,4313],{},[772,4309,4312],{"href":4310,"rel":4311},"https://github.com/contentauth/c2pa-js",[1966],"c2pa-js"," — browser/WASM SDK",[3146,4315,4316,4320],{},[772,4317,3630],{"href":4318,"rel":4319},"https://github.com/contentauth/c2pa-rs/tree/main/cli",[1966]," — official CLI",[787,4322,4326],{"description":4323,"icon":805,"title":4324,"target":4258,"to":4325},"Drop-a-file viewers for inspecting manifests without writing code.","Verification tools","https://contentcredentials.org/verify",[3143,4327,4328,4335,4343],{},[3146,4329,4330,4334],{},[772,4331,4333],{"href":4325,"rel":4332},[1966],"verify.contentauthenticity.org"," — Adobe's official viewer",[3146,4336,4337,4342],{},[772,4338,4341],{"href":4339,"rel":4340},"https://c2paviewer.com/",[1966],"c2paviewer.com"," — community viewer",[3146,4344,4345,4349],{},[772,4346,4348],{"href":4082,"rel":4347},[1966],"melchersystem.com/c2pa-content-credentials-translator"," — plain-English translator",[787,4351,4355],{"description":4352,"icon":4353,"title":4354,"target":4258,"to":3637},"Our two MCP servers for music provenance and human-made certification.","i-lucide-github","MusicTech Lab open source",[3143,4356,4357,4363],{},[3146,4358,4359,4362],{},[772,4360,3639],{"href":3637,"rel":4361},[1966]," — read C2PA manifests in Claude",[3146,4364,4365,4370],{},[772,4366,4369],{"href":4367,"rel":4368},"https://github.com/verifiedhumancert/verified-human-mcp-server",[1966],"verified-human-mcp-server"," — query the Verified Human Cert registry",[4372,4373],"hr",{},[764,4375,4377],{"id":4376},"need-help-with-c2pa-and-music-provenance","Need Help with C2PA and Music Provenance?",[749,4379,4380],{},"Building C2PA into your distribution pipeline, AI music platform, or rights workflow? We've been there.",[749,4382,4383,4387],{},[772,4384,4386],{"href":4385},"/contact","Let's talk",", no sales pitch, just honest engineering advice.",[1991,4389,4390],{},"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 .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .su27w, html code.shiki .su27w{--shiki-light:#916B53;--shiki-default:#916B53;--shiki-dark:#916B53}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}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":1073,"searchDepth":1570,"depth":1570,"links":4392},[4393,4394,4395,4396,4397,4398,4399,4400],{"id":3134,"depth":1570,"text":3135},{"id":3196,"depth":1570,"text":3197},{"id":3573,"depth":1570,"text":3574},{"id":3623,"depth":1570,"text":3624},{"id":4068,"depth":1570,"text":4069},{"id":4097,"depth":1570,"text":4098},{"id":4249,"depth":1570,"text":4250},{"id":4376,"depth":1570,"text":4377},"2026-05-28T00:00:00.000Z","C2PA is the open standard for content provenance, and it just landed in music files. We open-sourced an MCP server so you can read these manifests inside Claude Code.",[4404,4407,4410,4413,4416],{"question":4405,"answer":4406},"What is C2PA?","C2PA (Coalition for Content Provenance and Authenticity) is an open standard, governed by the Joint Development Foundation, that embeds a signed manifest inside a media file recording who made it, what tool produced it, what edits were applied, and what ingredients were used. It is the technical foundation behind Adobe Content Credentials.",{"question":4408,"answer":4409},"How is C2PA different from existing music metadata standards like ID3, ISRC, or DDEX?","ID3, ISRC, and DDEX answer who owns and identifies a recording. C2PA answers who created it and how. The two layers are complementary: rights metadata says this track is registered to label X under ISRC Y, while a C2PA manifest says this track was generated by tool Z on date D, with a verifiable signature.",{"question":4411,"answer":4412},"Why is C2PA only now arriving in music?","The standard was developed image-first. Tooling, software support, and signing trust lists matured for JPEG and PNG before audio. The c2pa-rs Rust library added robust MP3, WAV, and FLAC support over the past year, which is what makes audio adoption practical now.",{"question":4414,"answer":4415},"What is SynthID, and how does it relate to C2PA?","SynthID is Google DeepMind's imperceptible watermark for AI-generated content. It is embedded in the audio waveform itself, so it survives stripping of the C2PA manifest. C2PA records that SynthID was applied as an action in the manifest, but the two layers are independent: C2PA is the signed declaration, SynthID is the in-content signal.",{"question":4417,"answer":4418},"Can I read C2PA manifests without installing the Rust c2patool?","Yes. Our open-source mtl-c2pa-mcp wraps the official c2pa-python library and exposes it as MCP tools in Claude Code. Ask Claude what does the C2PA manifest in this MP3 say, and it returns a human-friendly summary.",{"src":4420},"/images/blog/musictechlab_blog_c2pa-in-music-mcp.webp",{"enabled":2041,"items":4422},[4423,4426,4429,4431],{"text":4424,"icon":4425},"C2PA is the open standard for cryptographically signed content provenance, backed by Adobe, Microsoft, Google, BBC, and others.","i-lucide-shield-check",{"text":4427,"icon":4428},"It fills the missing layer in music metadata: not who owns a track, but who created it and how.","i-lucide-fingerprint",{"text":4430,"icon":4108},"Google Lyria is the first major AI music service to ship C2PA in MP3 downloads, signaling the standard's arrival in audio.",{"text":4432,"icon":2053},"Our open-source MCP server reads C2PA manifests directly inside Claude Code.",{},{"title":4435,"description":4436},"C2PA in Music: MCP for Content Provenance | MusicTech Lab","Read C2PA content provenance manifests in music files (MP3, WAV, FLAC) inside Claude Code with our open-source MCP server. Inspect AI provenance in plain English.",[3114,4438,4439,4440,2059],"provenance","AI","content-credentials","WnLIMVZH29tclFMoww35E8u5c5uYuYY5T6omzy5ncak",{"id":4443,"title":104,"authors":4444,"badge":2021,"body":4447,"category":2020,"client":2021,"date":4451,"description":4452,"extension":2024,"faq":2021,"featured":69,"featuredOrder":2021,"hidden":69,"image":4453,"keyTakeaways":2021,"meta":4455,"navigation":2041,"path":105,"seo":4456,"status":4457,"stem":106,"tags":4458,"teaser":4462,"__hash__":4463,"score":1576},"posts/blog/music-data/broken-feedback-loop-music-collaboration.md",[4445],{"name":738,"to":739,"avatar":4446},{"src":741},{"type":746,"value":4448,"toc":4449},[],{"title":1073,"searchDepth":1570,"depth":1570,"links":4450},[],"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":4454},"/images/blog/musictechlab_blog_broken-feedback-loop.webp",{},{"title":104,"description":4452},"upcoming",[2062,4459,4460,4461],"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":4465,"title":200,"authors":4466,"badge":4469,"body":4472,"category":2020,"client":2021,"date":5875,"description":5876,"extension":2024,"faq":5877,"featured":69,"featuredOrder":2021,"hidden":69,"image":5890,"keyTakeaways":5892,"meta":5903,"navigation":2041,"path":201,"seo":5904,"status":2021,"stem":202,"tags":5907,"teaser":2021,"__hash__":5913,"score":1576},"posts/blog/music-data/which-database-for-music-data-redshift-vs-bigquery-vs-clickhouse.md",[4467],{"name":738,"to":739,"avatar":4468},{"src":741},{"label":4470,"color":4471},"Distribution","#0ea5e9",{"type":746,"value":4473,"toc":5849},[4474,4477,4480,4484,4487,4509,4512,4516,4520,4523,4529,4534,4551,4556,4567,4572,4576,4579,4584,4588,4605,4609,4623,4628,4632,4635,4640,4644,4661,4665,4679,4684,4688,4868,4872,4879,4883,4944,4949,4953,4956,5045,5049,5134,5139,5143,5149,5153,5156,5160,5269,5316,5320,5427,5472,5476,5565,5598,5603,5607,5610,5679,5683,5686,5697,5700,5711,5714,5725,5729,5732,5774,5777,5781,5784,5789,5794,5799,5802,5805,5808,5841,5846],[749,4475,4476],{},"Music companies sit on mountains of data. Streaming royalties from dozens of DSPs. Multi-currency transactions across territories. Financial records that need to reconcile between royalty systems and general ledgers. The database you choose to store and query this data shapes everything downstream: how fast your dashboards load, how much you pay per month, and whether your finance team can actually get answers without filing a ticket.",[749,4478,4479],{},"We have built music data systems on Elasticsearch, ClickHouse, and BigQuery. Each one solved a different problem. This article breaks down when to use which, with real pricing numbers and performance benchmarks so you can make the right call for your catalog.",[764,4481,4483],{"id":4482},"what-makes-music-data-different","What makes music data different",[749,4485,4486],{},"Before comparing databases, it helps to understand why music data is uniquely challenging. A typical mid-size label deals with several patterns that push general-purpose databases to their limits.",[778,4488,4490,4494,4499,4504],{"className":4489},[781,782,783,784,785],[787,4491],{"description":4492,"icon":3001,"title":4493},"A single quarterly DSP statement can contain millions of rows. One track, dozens of territories, multiple income types.","High Volume",[787,4495],{"description":4496,"icon":4497,"title":4498},"Revenue arrives in GBP, gets converted to USD, reported in EUR, and settled in the artist's local currency.","i-lucide-coins","Multi-Currency",[787,4500],{"description":4501,"icon":4502,"title":4503},"Track to release to label to artist to contract. Each level has its own royalty rates, reserves, and deductions.","i-lucide-git-branch","Complex Relationships",[787,4505],{"description":4506,"icon":4507,"title":4508},"Every transaction has two dates: when the DSP reported it (cash basis) and when the stream actually happened (accrual basis).","i-lucide-calendar-range","Dual Temporal",[749,4510,4511],{},"These patterns mean your database needs to handle complex joins, large aggregations, and flexible time-based queries. Not every database does this equally well.",[764,4513,4515],{"id":4514},"the-three-contenders","The three contenders",[856,4517,4519],{"id":4518},"bigquery-the-serverless-warehouse","BigQuery: the serverless warehouse",[749,4521,4522],{},"Google BigQuery is a fully managed, serverless data warehouse. You do not provision clusters, tune nodes, or worry about scaling. You write SQL, BigQuery figures out the rest.",[749,4524,4525,4528],{},[753,4526,4527],{},"Architecture:"," Columnar storage with a distributed query engine. Separates storage and compute, so you pay independently for each. Data lives in Google Cloud Storage under the hood.",[749,4530,4531],{},[753,4532,4533],{},"What it does well for music companies:",[3143,4535,4536,4539,4542,4545,4548],{},[3146,4537,4538],{},"Complex SQL joins across 15+ dimension tables (labels, artists, tracks, territories, DSPs)",[3146,4540,4541],{},"dbt integration is first-class, with native support for the staging-intermediate-marts pattern",[3146,4543,4544],{},"Handles 50M+ row fact tables without breaking a sweat",[3146,4546,4547],{},"Native connectors to Looker, Sigma Computing, and Looker Studio for BI",[3146,4549,4550],{},"Zero infrastructure management, your finance team never waits on DevOps",[749,4552,4553],{},[753,4554,4555],{},"Where it falls short:",[3143,4557,4558,4561,4564],{},[3146,4559,4560],{},"Query latency is typically 1-2 seconds, not sub-second",[3146,4562,4563],{},"On-demand pricing can spike if analysts run unoptimized queries on large tables",[3146,4565,4566],{},"Not ideal for high-concurrency, user-facing dashboards with hundreds of simultaneous users",[1534,4568,4569],{},[749,4570,4571],{},"BigQuery offers a 1 TB/month free tier for queries. For a small label just getting started with analytics, you can run a meaningful data warehouse for nearly zero cost.",[856,4573,4575],{"id":4574},"redshift-the-aws-powerhouse","Redshift: the AWS powerhouse",[749,4577,4578],{},"Amazon Redshift is a cluster-based columnar data warehouse built on PostgreSQL. It has been the default choice for AWS-native organizations for over a decade.",[749,4580,4581,4583],{},[753,4582,4527],{}," Provisioned clusters with leader and compute nodes. You choose node types and quantities based on your workload. Redshift Serverless is also available as a pay-per-query alternative.",[749,4585,4586],{},[753,4587,4533],{},[3143,4589,4590,4593,4596,4599,4602],{},[3146,4591,4592],{},"Deep AWS ecosystem integration (S3, Glue, Lambda, Step Functions)",[3146,4594,4595],{},"PostgreSQL compatibility means most SQL tools and libraries work out of the box",[3146,4597,4598],{},"Mature ecosystem with extensive documentation and community support",[3146,4600,4601],{},"Fine-grained cluster tuning for teams that want control over performance",[3146,4603,4604],{},"Spectrum lets you query data directly in S3 without loading it",[749,4606,4607],{},[753,4608,4555],{},[3143,4610,4611,4614,4617,4620],{},[3146,4612,4613],{},"Provisioned clusters cost money even when idle, a 24/7 dc2.large node runs ~$180/month",[3146,4615,4616],{},"Requires capacity planning and occasional cluster resizing",[3146,4618,4619],{},"More operational overhead than BigQuery",[3146,4621,4622],{},"Scaling up means migrating to larger nodes or adding more, not automatic",[4087,4624,4625],{},[749,4626,4627],{},"With Redshift provisioned clusters, you pay for compute whether anyone is running queries or not. If your team primarily queries during business hours, you are paying for 16 idle hours per day. Consider Redshift Serverless or BigQuery if your usage is bursty.",[856,4629,4631],{"id":4630},"clickhouse-the-speed-demon","ClickHouse: the speed demon",[749,4633,4634],{},"ClickHouse is an open-source, column-oriented OLAP database designed for sub-second analytical queries. Originally built at Yandex to handle billions of page-view events, it has become the go-to choice for real-time analytics.",[749,4636,4637,4639],{},[753,4638,4527],{}," Vectorized query execution with native compression. Processes data in columns rather than rows, which makes aggregations extremely fast. Available as self-hosted (open source) or ClickHouse Cloud (managed).",[749,4641,4642],{},[753,4643,4533],{},[3143,4645,4646,4649,4652,4655,4658],{},[3146,4647,4648],{},"Sub-second queries on billions of rows, 5-10x faster than BigQuery and Redshift on aggregations",[3146,4650,4651],{},"Real-time ingestion with no batch delay",[3146,4653,4654],{},"Excellent compression ratios reduce storage costs significantly",[3146,4656,4657],{},"Ideal for streaming play-count dashboards, listener behavior analytics, and DSP performance monitoring",[3146,4659,4660],{},"Cost-effective at scale, especially self-hosted",[749,4662,4663],{},[753,4664,4555],{},[3143,4666,4667,4670,4673,4676],{},[3146,4668,4669],{},"Joins are more limited and less optimized than BigQuery or Redshift",[3146,4671,4672],{},"Smaller BI tool ecosystem, Looker and Sigma have limited native support",[3146,4674,4675],{},"Self-hosting requires operational expertise (replication, backups, upgrades)",[3146,4677,4678],{},"Not designed for complex multi-table financial reporting",[1534,4680,4681],{},[749,4682,4683],{},"ClickHouse compresses data aggressively, often achieving 5-10x compression. A 500 GB dataset in BigQuery might only consume 50-100 GB in ClickHouse, directly reducing storage costs.",[764,4685,4687],{"id":4686},"head-to-head-comparison","Head-to-head comparison",[861,4689,4690,4706],{},[864,4691,4692],{},[867,4693,4694,4697,4700,4703],{},[870,4695,4696],{},"Feature",[870,4698,4699],{},"BigQuery",[870,4701,4702],{},"Redshift",[870,4704,4705],{},"ClickHouse",[877,4707,4708,4724,4740,4756,4772,4788,4804,4820,4836,4852],{},[867,4709,4710,4715,4718,4721],{},[882,4711,4712],{},[753,4713,4714],{},"Deployment",[882,4716,4717],{},"Serverless (managed)",[882,4719,4720],{},"Cluster or Serverless",[882,4722,4723],{},"Self-hosted or Cloud",[867,4725,4726,4731,4734,4737],{},[882,4727,4728],{},[753,4729,4730],{},"Query latency",[882,4732,4733],{},"1-2 seconds",[882,4735,4736],{},"1-3 seconds",[882,4738,4739],{},"50-500 ms",[867,4741,4742,4747,4750,4753],{},[882,4743,4744],{},[753,4745,4746],{},"Joins",[882,4748,4749],{},"Full SQL, excellent",[882,4751,4752],{},"Full SQL, good",[882,4754,4755],{},"Limited, basic",[867,4757,4758,4763,4766,4769],{},[882,4759,4760],{},[753,4761,4762],{},"Scaling",[882,4764,4765],{},"Automatic",[882,4767,4768],{},"Manual (cluster) or auto (serverless)",[882,4770,4771],{},"Manual (self) or auto (cloud)",[867,4773,4774,4779,4782,4785],{},[882,4775,4776],{},[753,4777,4778],{},"dbt support",[882,4780,4781],{},"Native, first-class",[882,4783,4784],{},"Native, good",[882,4786,4787],{},"Community adapter",[867,4789,4790,4795,4798,4801],{},[882,4791,4792],{},[753,4793,4794],{},"BI ecosystem",[882,4796,4797],{},"Looker, Sigma, Tableau, Looker Studio",[882,4799,4800],{},"QuickSight, Tableau, Looker",[882,4802,4803],{},"Grafana, Metabase, Superset",[867,4805,4806,4811,4814,4817],{},[882,4807,4808],{},[753,4809,4810],{},"SQL dialect",[882,4812,4813],{},"GoogleSQL",[882,4815,4816],{},"PostgreSQL-based",[882,4818,4819],{},"ClickHouse SQL",[867,4821,4822,4827,4830,4833],{},[882,4823,4824],{},[753,4825,4826],{},"Best concurrency",[882,4828,4829],{},"~100 concurrent",[882,4831,4832],{},"~50 concurrent",[882,4834,4835],{},"1000+ concurrent",[867,4837,4838,4843,4846,4849],{},[882,4839,4840],{},[753,4841,4842],{},"Learning curve",[882,4844,4845],{},"Low",[882,4847,4848],{},"Medium",[882,4850,4851],{},"Medium-High",[867,4853,4854,4859,4862,4865],{},[882,4855,4856],{},[753,4857,4858],{},"Vendor lock-in",[882,4860,4861],{},"High (GCP)",[882,4863,4864],{},"High (AWS)",[882,4866,4867],{},"Low (open source)",[764,4869,4871],{"id":4870},"pricing-simulation-a-mid-size-music-label","Pricing simulation: a mid-size music label",[749,4873,4874,4875,4878],{},"Let's model real costs for a label with ",[753,4876,4877],{},"15 owned labels, 50 million royalty rows, and a 5-person analytics team"," running daily queries.",[856,4880,4882],{"id":4881},"storage-50m-rows-of-royalty-data-200-gb-uncompressed","Storage: 50M rows of royalty data (~200 GB uncompressed)",[861,4884,4885,4898],{},[864,4886,4887],{},[867,4888,4889,4892,4895],{},[870,4890,4891],{},"Database",[870,4893,4894],{},"Storage model",[870,4896,4897],{},"Monthly cost",[877,4899,4900,4915,4929],{},[867,4901,4902,4906,4909],{},[882,4903,4904],{},[753,4905,4699],{},[882,4907,4908],{},"$20/TB active, $10/TB long-term",[882,4910,4911,4914],{},[753,4912,4913],{},"$4/mo"," (200 GB active)",[867,4916,4917,4921,4924],{},[882,4918,4919],{},[753,4920,4702],{},[882,4922,4923],{},"Included in node cost (managed storage: $0.024/GB)",[882,4925,4926],{},[753,4927,4928],{},"$4.80/mo",[867,4930,4931,4936,4939],{},[882,4932,4933],{},[753,4934,4935],{},"ClickHouse Cloud",[882,4937,4938],{},"$25.30/TB (compressed, ~40 GB after compression)",[882,4940,4941],{},[753,4942,4943],{},"$1.01/mo",[758,4945,4946],{},[749,4947,4948],{},"Storage costs are nearly identical and trivially small at this scale. The real cost difference comes from compute.",[856,4950,4952],{"id":4951},"compute-daily-queries-by-a-5-person-team","Compute: daily queries by a 5-person team",[749,4954,4955],{},"Assumptions: 20 queries/day per analyst, ~5 GB scanned per query, 22 working days/month.",[861,4957,4958,4969],{},[864,4959,4960],{},[867,4961,4962,4964,4967],{},[870,4963,4891],{},[870,4965,4966],{},"Pricing model",[870,4968,4897],{},[877,4970,4971,4986,5001,5016,5031],{},[867,4972,4973,4978,4981],{},[882,4974,4975,4977],{},[753,4976,4699],{}," (on-demand)",[882,4979,4980],{},"$6.25/TB scanned. 5 users x 20 queries x 5 GB x 22 days = ~11 TB/month",[882,4982,4983],{},[753,4984,4985],{},"$68/mo",[867,4987,4988,4993,4996],{},[882,4989,4990,4992],{},[753,4991,4699],{}," (flat-rate)",[882,4994,4995],{},"100 slots at ~$0.04/slot-hour x 730 hours",[882,4997,4998],{},[753,4999,5000],{},"$2,920/mo",[867,5002,5003,5008,5011],{},[882,5004,5005,5007],{},[753,5006,4702],{}," (dc2.large, 2 nodes)",[882,5009,5010],{},"$0.25/node/hour x 2 nodes x 730 hours",[882,5012,5013],{},[753,5014,5015],{},"$365/mo",[867,5017,5018,5023,5026],{},[882,5019,5020,5022],{},[753,5021,4702],{}," (Serverless)",[882,5024,5025],{},"$0.375/RPU-hour, ~4 RPUs x ~8 active hours x 22 days",[882,5027,5028],{},[753,5029,5030],{},"$264/mo",[867,5032,5033,5037,5040],{},[882,5034,5035],{},[753,5036,4935],{},[882,5038,5039],{},"~$0.10/compute-unit, auto-scaling with idle pause",[882,5041,5042],{},[753,5043,5044],{},"$80-150/mo",[856,5046,5048],{"id":5047},"total-monthly-cost-estimate","Total monthly cost estimate",[861,5050,5051,5062],{},[864,5052,5053],{},[867,5054,5055,5057,5059],{},[870,5056,4891],{},[870,5058,1885],{},[870,5060,5061],{},"Total/month",[877,5063,5064,5078,5092,5106,5120],{},[867,5065,5066,5070,5073],{},[882,5067,5068],{},[753,5069,4699],{},[882,5071,5072],{},"On-demand",[882,5074,5075],{},[753,5076,5077],{},"~$72",[867,5079,5080,5084,5087],{},[882,5081,5082],{},[753,5083,4699],{},[882,5085,5086],{},"Flat-rate (100 slots)",[882,5088,5089],{},[753,5090,5091],{},"~$2,925",[867,5093,5094,5098,5101],{},[882,5095,5096],{},[753,5097,4702],{},[882,5099,5100],{},"2x dc2.large (always on)",[882,5102,5103],{},[753,5104,5105],{},"~$370",[867,5107,5108,5112,5115],{},[882,5109,5110],{},[753,5111,4702],{},[882,5113,5114],{},"Serverless",[882,5116,5117],{},[753,5118,5119],{},"~$269",[867,5121,5122,5126,5129],{},[882,5123,5124],{},[753,5125,4935],{},[882,5127,5128],{},"Dev tier with auto-pause",[882,5130,5131],{},[753,5132,5133],{},"~$100-150",[4087,5135,5136],{},[749,5137,5138],{},"BigQuery on-demand looks cheapest, but costs scale linearly with query volume. If your team grows to 20 analysts running complex queries, you could easily hit $500-1,000/month. Partition your tables and use query cost controls to prevent surprises.",[856,5140,5142],{"id":5141},"annual-cost-projection","Annual cost projection",[1067,5144,5147],{"className":5145,"code":5146,"language":1072,"meta":1073},[1070],"                        Year 1      Year 2      Year 3\n                        (50M rows)  (65M rows)  (85M rows)\nBigQuery (on-demand)    $864        $1,080      $1,350\nRedshift (2x dc2)      $4,440      $4,440      $6,660*\nRedshift Serverless     $3,228      $3,900      $4,800\nClickHouse Cloud        $1,500      $1,800      $2,400\n\n* Redshift cluster upgrade needed at ~70M rows\n",[1075,5148,5146],{"__ignoreMap":1073},[764,5150,5152],{"id":5151},"performance-benchmarks-music-data-queries","Performance benchmarks: music data queries",[749,5154,5155],{},"Here is how each database handles typical music industry analytical queries on a 50M-row royalty dataset.",[856,5157,5159],{"id":5158},"query-1-revenue-by-label-last-12-months","Query 1: Revenue by label, last 12 months",[1067,5161,5165],{"className":5162,"code":5163,"language":5164,"meta":1073,"style":1073},"language-sql shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","SELECT label_name, SUM(net_revenue) AS total_revenue\nFROM fact_revenue\nJOIN dim_label USING (label_key)\nJOIN dim_date USING (date_key)\nWHERE dim_date.date >= DATE_SUB(CURRENT_DATE(), INTERVAL 12 MONTH)\nGROUP BY label_name\nORDER BY total_revenue DESC\n","sql",[1075,5166,5167,5187,5195,5209,5221,5250,5258],{"__ignoreMap":1073},[1560,5168,5169,5172,5175,5178,5181,5184],{"class":1562,"line":1563},[1560,5170,5171],{"class":2329},"SELECT",[1560,5173,5174],{"class":1566}," label_name, ",[1560,5176,5177],{"class":1821},"SUM",[1560,5179,5180],{"class":1566},"(net_revenue) ",[1560,5182,5183],{"class":2329},"AS",[1560,5185,5186],{"class":1566}," total_revenue\n",[1560,5188,5189,5192],{"class":1562,"line":1570},[1560,5190,5191],{"class":2329},"FROM",[1560,5193,5194],{"class":1566}," fact_revenue\n",[1560,5196,5197,5200,5203,5206],{"class":1562,"line":1576},[1560,5198,5199],{"class":2329},"JOIN",[1560,5201,5202],{"class":1566}," dim_label ",[1560,5204,5205],{"class":2329},"USING",[1560,5207,5208],{"class":1566}," (label_key)\n",[1560,5210,5211,5213,5216,5218],{"class":1562,"line":1582},[1560,5212,5199],{"class":2329},[1560,5214,5215],{"class":1566}," dim_date ",[1560,5217,5205],{"class":2329},[1560,5219,5220],{"class":1566}," (date_key)\n",[1560,5222,5223,5226,5229,5232,5235,5238,5241,5244,5247],{"class":1562,"line":1588},[1560,5224,5225],{"class":2329},"WHERE",[1560,5227,5228],{"class":1566}," dim_date.date ",[1560,5230,5231],{"class":1874},">=",[1560,5233,5234],{"class":1566}," DATE_SUB(CURRENT_DATE",[1560,5236,5237],{"class":1874},"()",[1560,5239,5240],{"class":1566},", INTERVAL ",[1560,5242,5243],{"class":2329},"12",[1560,5245,5246],{"class":2329}," MONTH",[1560,5248,5249],{"class":1566},")\n",[1560,5251,5252,5255],{"class":1562,"line":1594},[1560,5253,5254],{"class":2329},"GROUP BY",[1560,5256,5257],{"class":1566}," label_name\n",[1560,5259,5260,5263,5266],{"class":1562,"line":1599},[1560,5261,5262],{"class":2329},"ORDER BY",[1560,5264,5265],{"class":1566}," total_revenue ",[1560,5267,5268],{"class":2329},"DESC\n",[861,5270,5271,5283],{},[864,5272,5273],{},[867,5274,5275,5277,5280],{},[870,5276,4891],{},[870,5278,5279],{},"Execution time",[870,5281,5282],{},"Data scanned",[877,5284,5285,5295,5306],{},[867,5286,5287,5289,5292],{},[882,5288,4699],{},[882,5290,5291],{},"1.2 seconds",[882,5293,5294],{},"3.8 GB",[867,5296,5297,5300,5303],{},[882,5298,5299],{},"Redshift (dc2.large x2)",[882,5301,5302],{},"1.8 seconds",[882,5304,5305],{},"Full table",[867,5307,5308,5310,5313],{},[882,5309,4705],{},[882,5311,5312],{},"87 ms",[882,5314,5315],{},"0.4 GB (compressed)",[856,5317,5319],{"id":5318},"query-2-artist-recoupment-status-across-all-contracts","Query 2: Artist recoupment status across all contracts",[1067,5321,5323],{"className":5162,"code":5322,"language":5164,"meta":1073,"style":1073},"SELECT artist_name, contract_id,\n       SUM(revenue) AS earned,\n       advance_amount,\n       advance_amount - SUM(revenue) AS balance\nFROM fact_revenue\nJOIN dim_artist USING (artist_key)\nJOIN dim_contract USING (contract_key)\nGROUP BY artist_name, contract_id, advance_amount\nHAVING balance > 0\nORDER BY balance DESC\n",[1075,5324,5325,5332,5345,5350,5368,5374,5386,5398,5405,5419],{"__ignoreMap":1073},[1560,5326,5327,5329],{"class":1562,"line":1563},[1560,5328,5171],{"class":2329},[1560,5330,5331],{"class":1566}," artist_name, contract_id,\n",[1560,5333,5334,5337,5340,5342],{"class":1562,"line":1570},[1560,5335,5336],{"class":1821},"       SUM",[1560,5338,5339],{"class":1566},"(revenue) ",[1560,5341,5183],{"class":2329},[1560,5343,5344],{"class":1566}," earned,\n",[1560,5346,5347],{"class":1562,"line":1576},[1560,5348,5349],{"class":1566},"       advance_amount,\n",[1560,5351,5352,5355,5358,5361,5363,5365],{"class":1562,"line":1582},[1560,5353,5354],{"class":1566},"       advance_amount ",[1560,5356,5357],{"class":1874},"-",[1560,5359,5360],{"class":1821}," SUM",[1560,5362,5339],{"class":1566},[1560,5364,5183],{"class":2329},[1560,5366,5367],{"class":1566}," balance\n",[1560,5369,5370,5372],{"class":1562,"line":1588},[1560,5371,5191],{"class":2329},[1560,5373,5194],{"class":1566},[1560,5375,5376,5378,5381,5383],{"class":1562,"line":1594},[1560,5377,5199],{"class":2329},[1560,5379,5380],{"class":1566}," dim_artist ",[1560,5382,5205],{"class":2329},[1560,5384,5385],{"class":1566}," (artist_key)\n",[1560,5387,5388,5390,5393,5395],{"class":1562,"line":1599},[1560,5389,5199],{"class":2329},[1560,5391,5392],{"class":1566}," dim_contract ",[1560,5394,5205],{"class":2329},[1560,5396,5397],{"class":1566}," (contract_key)\n",[1560,5399,5400,5402],{"class":1562,"line":1605},[1560,5401,5254],{"class":2329},[1560,5403,5404],{"class":1566}," artist_name, contract_id, advance_amount\n",[1560,5406,5407,5410,5413,5416],{"class":1562,"line":1611},[1560,5408,5409],{"class":2329},"HAVING",[1560,5411,5412],{"class":1566}," balance ",[1560,5414,5415],{"class":1874},">",[1560,5417,5418],{"class":2329}," 0\n",[1560,5420,5421,5423,5425],{"class":1562,"line":1617},[1560,5422,5262],{"class":2329},[1560,5424,5412],{"class":1566},[1560,5426,5268],{"class":2329},[861,5428,5429,5440],{},[864,5430,5431],{},[867,5432,5433,5435,5437],{},[870,5434,4891],{},[870,5436,5279],{},[870,5438,5439],{},"Notes",[877,5441,5442,5452,5462],{},[867,5443,5444,5446,5449],{},[882,5445,4699],{},[882,5447,5448],{},"2.1 seconds",[882,5450,5451],{},"Handles multi-table join well",[867,5453,5454,5456,5459],{},[882,5455,4702],{},[882,5457,5458],{},"2.8 seconds",[882,5460,5461],{},"Comparable with sort keys",[867,5463,5464,5466,5469],{},[882,5465,4705],{},[882,5467,5468],{},"450 ms",[882,5470,5471],{},"Slower due to joins, still fast",[856,5473,5475],{"id":5474},"query-3-real-time-play-counts-by-territory-1b-events","Query 3: Real-time play counts by territory (1B events)",[1067,5477,5479],{"className":5162,"code":5478,"language":5164,"meta":1073,"style":1073},"SELECT territory, COUNT(*) AS plays, SUM(revenue) AS revenue\nFROM streaming_events\nWHERE event_date >= today() - 7\nGROUP BY territory\nORDER BY plays DESC\nLIMIT 50\n",[1075,5480,5481,5514,5521,5541,5548,5557],{"__ignoreMap":1073},[1560,5482,5483,5485,5488,5491,5494,5497,5500,5502,5505,5507,5509,5511],{"class":1562,"line":1563},[1560,5484,5171],{"class":2329},[1560,5486,5487],{"class":1566}," territory, ",[1560,5489,5490],{"class":1821},"COUNT",[1560,5492,5493],{"class":1566},"(",[1560,5495,5496],{"class":1874},"*",[1560,5498,5499],{"class":1566},") ",[1560,5501,5183],{"class":2329},[1560,5503,5504],{"class":1566}," plays, ",[1560,5506,5177],{"class":1821},[1560,5508,5339],{"class":1566},[1560,5510,5183],{"class":2329},[1560,5512,5513],{"class":1566}," revenue\n",[1560,5515,5516,5518],{"class":1562,"line":1570},[1560,5517,5191],{"class":2329},[1560,5519,5520],{"class":1566}," streaming_events\n",[1560,5522,5523,5525,5528,5530,5533,5535,5538],{"class":1562,"line":1576},[1560,5524,5225],{"class":2329},[1560,5526,5527],{"class":1566}," event_date ",[1560,5529,5231],{"class":1874},[1560,5531,5532],{"class":1566}," today",[1560,5534,5237],{"class":1874},[1560,5536,5537],{"class":1874}," -",[1560,5539,5540],{"class":2329}," 7\n",[1560,5542,5543,5545],{"class":1562,"line":1582},[1560,5544,5254],{"class":2329},[1560,5546,5547],{"class":1566}," territory\n",[1560,5549,5550,5552,5555],{"class":1562,"line":1588},[1560,5551,5262],{"class":2329},[1560,5553,5554],{"class":1566}," plays ",[1560,5556,5268],{"class":2329},[1560,5558,5559,5562],{"class":1562,"line":1594},[1560,5560,5561],{"class":2329},"LIMIT",[1560,5563,5564],{"class":2329}," 50\n",[861,5566,5567,5575],{},[864,5568,5569],{},[867,5570,5571,5573],{},[870,5572,4891],{},[870,5574,5279],{},[877,5576,5577,5584,5591],{},[867,5578,5579,5581],{},[882,5580,4699],{},[882,5582,5583],{},"3.4 seconds",[867,5585,5586,5588],{},[882,5587,4702],{},[882,5589,5590],{},"4.1 seconds",[867,5592,5593,5595],{},[882,5594,4705],{},[882,5596,5597],{},"120 ms",[758,5599,5600],{},[749,5601,5602],{},"ClickHouse dominates on single-table aggregations. BigQuery and Redshift are better when you need complex joins across many dimension tables, which is the typical pattern for financial reporting.",[764,5604,5606],{"id":5605},"decision-framework","Decision framework",[749,5608,5609],{},"Choosing the right database is not about which one is \"best.\" It is about which one fits your specific workload, team, and infrastructure.",[778,5611,5613,5635,5657],{"className":5612},[781,782,1770,784,785],[787,5614,5618],{"description":5615,"icon":5616,"title":5617},"Financial reporting, royalty reconciliation, small teams.","i-lucide-database","Choose BigQuery",[3143,5619,5620,5623,5626,5629,5632],{},[3146,5621,5622],{},"Reconciling royalty systems to GL",[3146,5624,5625],{},"Executive dashboards with complex joins",[3146,5627,5628],{},"dbt-powered transformation pipelines",[3146,5630,5631],{},"Team has no dedicated DevOps",[3146,5633,5634],{},"Already on Google Cloud",[787,5636,5640],{"description":5637,"icon":5638,"title":5639},"AWS-native orgs with existing data engineering teams.","i-lucide-cloud","Choose Redshift",[3143,5641,5642,5645,5648,5651,5654],{},[3146,5643,5644],{},"Deep AWS ecosystem (S3, Glue, Lambda)",[3146,5646,5647],{},"Team already knows PostgreSQL",[3146,5649,5650],{},"Need fine-grained performance tuning",[3146,5652,5653],{},"Running other AWS analytics services",[3146,5655,5656],{},"Want Spectrum for S3 data lake queries",[787,5658,5662],{"description":5659,"icon":5660,"title":5661},"Real-time analytics, high-concurrency dashboards.","i-lucide-zap","Choose ClickHouse",[3143,5663,5664,5667,5670,5673,5676],{},[3146,5665,5666],{},"Streaming play-count dashboards",[3146,5668,5669],{},"Listener behavior analytics",[3146,5671,5672],{},"DSP performance monitoring",[3146,5674,5675],{},"User-facing analytics features",[3146,5677,5678],{},"Need sub-second query response",[856,5680,5682],{"id":5681},"can-you-combine-them","Can you combine them?",[749,5684,5685],{},"Yes, and some of the most effective music data architectures do exactly that.",[749,5687,5688,5689,5692,5693,5696],{},"A practical combination: ",[753,5690,5691],{},"ClickHouse for real-time dashboards"," (streaming counts, live territory maps, DSP performance) feeding from event streams, plus ",[753,5694,5695],{},"BigQuery for financial reporting"," (royalty reconciliation, label P&Ls, catalog valuation) with dbt transformations on a daily batch cycle.",[749,5698,5699],{},"This works well when:",[3143,5701,5702,5705,5708],{},[3146,5703,5704],{},"Different teams have different latency requirements",[3146,5706,5707],{},"Real-time event data and financial reporting serve different audiences",[3146,5709,5710],{},"Your streaming volume justifies a dedicated OLAP engine",[749,5712,5713],{},"It becomes over-engineering when:",[3143,5715,5716,5719,5722],{},[3146,5717,5718],{},"Your team is small (under 5 people)",[3146,5720,5721],{},"All queries are batch/daily",[3146,5723,5724],{},"You do not have dedicated infrastructure engineers",[764,5726,5728],{"id":5727},"what-about-elasticsearch-and-dynamodb","What about Elasticsearch and DynamoDB?",[749,5730,5731],{},"These come up in conversations about music data, but they solve fundamentally different problems.",[861,5733,5734,5746],{},[864,5735,5736],{},[867,5737,5738,5740,5743],{},[870,5739,4891],{},[870,5741,5742],{},"Purpose",[870,5744,5745],{},"Music use case",[877,5747,5748,5761],{},[867,5749,5750,5755,5758],{},[882,5751,5752],{},[753,5753,5754],{},"Elasticsearch",[882,5756,5757],{},"Full-text search and log analytics",[882,5759,5760],{},"Catalog search (find tracks by title, ISRC, artist), log monitoring, operational dashboards",[867,5762,5763,5768,5771],{},[882,5764,5765],{},[753,5766,5767],{},"DynamoDB",[882,5769,5770],{},"Transactional key-value store",[882,5772,5773],{},"User accounts, playlist storage, session management, low-latency app backends",[749,5775,5776],{},"Neither is a data warehouse. You would not run royalty reconciliation on Elasticsearch or catalog valuation queries on DynamoDB. Know the difference, and use each tool in its lane.",[764,5778,5780],{"id":5779},"our-experience-at-musictech-lab","Our experience at MusicTech Lab",[749,5782,5783],{},"We have built music data systems across this entire spectrum.",[749,5785,5786,5788],{},[753,5787,5754],{}," powered our royalty search engine, processing data from 15+ distributors into a unified, searchable catalog. It excels at finding a specific transaction across 200 million records in milliseconds. But it cannot calculate a label P&L.",[749,5790,5791,5793],{},[753,5792,4705],{}," drives our AI-powered analytics dashboard, where non-technical users type plain English questions and get charts back in seconds. Sub-second aggregation on tens of millions of rows makes the conversational experience feel instant.",[749,5795,5796,5798],{},[753,5797,4699],{}," is the direction we are actively exploring for financial reporting and reconciliation, connecting royalty data to general ledger systems through dbt transformations. We are deep in the learning phase right now, studying dimensional modeling, star schemas, and the dbt ecosystem. The serverless model and native BI integrations make it a compelling foundation for label finance teams.",[749,5800,5801],{},"The lesson: there is no single \"best database for music.\" There is the right database for your specific workload. And sometimes the right answer is to start learning the tool before your next project demands it.",[764,5803,5804],{"id":1791},"Getting started",[749,5806,5807],{},"If you are a music company evaluating databases for the first time, start here:",[5809,5810,5811,5817,5823,5829,5835],"ol",{},[3146,5812,5813,5816],{},[753,5814,5815],{},"Map your workloads."," List every report, dashboard, and query your team runs. Categorize each as financial reporting, real-time analytics, or search.",[3146,5818,5819,5822],{},[753,5820,5821],{},"Count your data."," How many rows today? What is your annual growth rate? A 10M-row label has very different needs than a 500M-row distributor.",[3146,5824,5825,5828],{},[753,5826,5827],{},"Assess your team."," Do you have data engineers? DevOps? Or is your \"data team\" a finance analyst who knows Excel? This changes the answer dramatically.",[3146,5830,5831,5834],{},[753,5832,5833],{},"Start serverless."," Unless you have a clear reason for provisioned infrastructure, BigQuery on-demand or ClickHouse Cloud with auto-pause will get you running faster and cheaper.",[3146,5836,5837,5840],{},[753,5838,5839],{},"Design for the dimensional model first."," The database choice matters less than your data model. A well-designed star schema performs well on any of these three platforms. A poorly designed model performs badly on all of them.",[1534,5842,5843],{},[749,5844,5845],{},"The most expensive database decision is not picking the wrong vendor. It is building without a proper data model and having to rebuild everything six months later. Invest the time upfront in your dimensional design.",[1991,5847,5848],{},"html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}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 .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":1073,"searchDepth":1570,"depth":1570,"links":5850},[5851,5852,5857,5858,5864,5869,5872,5873,5874],{"id":4482,"depth":1570,"text":4483},{"id":4514,"depth":1570,"text":4515,"children":5853},[5854,5855,5856],{"id":4518,"depth":1576,"text":4519},{"id":4574,"depth":1576,"text":4575},{"id":4630,"depth":1576,"text":4631},{"id":4686,"depth":1570,"text":4687},{"id":4870,"depth":1570,"text":4871,"children":5859},[5860,5861,5862,5863],{"id":4881,"depth":1576,"text":4882},{"id":4951,"depth":1576,"text":4952},{"id":5047,"depth":1576,"text":5048},{"id":5141,"depth":1576,"text":5142},{"id":5151,"depth":1570,"text":5152,"children":5865},[5866,5867,5868],{"id":5158,"depth":1576,"text":5159},{"id":5318,"depth":1576,"text":5319},{"id":5474,"depth":1576,"text":5475},{"id":5605,"depth":1570,"text":5606,"children":5870},[5871],{"id":5681,"depth":1576,"text":5682},{"id":5727,"depth":1570,"text":5728},{"id":5779,"depth":1570,"text":5780},{"id":1791,"depth":1570,"text":5804},"2026-04-23T00:00:00.000Z","A practical comparison of BigQuery, Redshift, and ClickHouse for music industry workloads, from royalty reporting to real-time streaming analytics.",[5878,5881,5884,5887],{"question":5879,"answer":5880},"Which database is best for music royalty reporting?","Google BigQuery is the strongest choice for royalty reporting. It handles complex SQL joins across fact and dimension tables, supports dbt natively for transformation pipelines, and its serverless model means you pay only for queries you run. Most music companies doing financial reporting and reconciliation across multiple systems choose BigQuery.",{"question":5882,"answer":5883},"Can ClickHouse replace BigQuery for music analytics?","ClickHouse excels at real-time analytical queries on large event datasets, like streaming play counts or listener behavior. However, it has more limited join capabilities and a smaller BI tool ecosystem. For financial reporting with complex multi-table joins, BigQuery is a better fit. Some companies use both: ClickHouse for real-time dashboards and BigQuery for financial reporting.",{"question":5885,"answer":5886},"How much does it cost to run a music data warehouse?","For a typical mid-size label with 50 million rows: BigQuery costs roughly $120-200/month (storage + queries). Redshift starts around $180-550/month for a minimal cluster. ClickHouse Cloud runs approximately $100-250/month depending on query volume. The biggest cost variable is query frequency, not storage.",{"question":5888,"answer":5889},"What about Elasticsearch or DynamoDB for music data?","Elasticsearch is a search engine, not a data warehouse. It is excellent for full-text catalog search and log analysis but cannot handle financial reporting or complex aggregations. DynamoDB is a transactional key-value store designed for low-latency lookups like user sessions or playlist storage. Neither is suitable as your primary analytics database.",{"src":5891},"/images/blog/musictechlab_blog_database-for-music-data.webp",{"enabled":2041,"items":5893},[5894,5896,5898,5900],{"text":5895,"icon":5616},"BigQuery is the best fit for financial reporting, royalty reconciliation, and teams without dedicated DevOps.",{"text":5897,"icon":5660},"ClickHouse delivers sub-second queries on billions of rows, ideal for real-time streaming dashboards.",{"text":5899,"icon":5638},"Redshift fits organizations already invested in the AWS ecosystem with existing data engineering teams.",{"text":5901,"icon":5902},"The right choice depends on your workload pattern, team size, and where your data already lives.","i-lucide-target",{},{"title":5905,"description":5906},"BigQuery vs Redshift vs ClickHouse for Music | MusicTech Lab","Practical comparison of three databases for music royalty data, streaming analytics, and financial reporting. Real pricing and performance numbers.",[5908,5909,5910,2020,5911,2064,5912],"bigquery","redshift","clickhouse","data-warehouse","royalties","9App3vpStCDB3fyT7KUwWU4K2oZ6GdeJD5s-gyCruWA",1780305178627]