[{"data":1,"prerenderedAt":2022},["ShallowReactive",2],{"navigation":3,"/blog/software-development/how-to-handle-high-loads-on-e-commerce-platform-with-ease-post":734,"/blog/software-development/how-to-handle-high-loads-on-e-commerce-platform-with-ease-surround":836,"/blog/software-development/how-to-handle-high-loads-on-e-commerce-platform-with-ease-related":841},[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":530,"authors":736,"badge":741,"body":742,"category":809,"client":741,"date":810,"description":811,"extension":812,"faq":741,"featured":69,"featuredOrder":741,"hidden":813,"image":814,"keyTakeaways":816,"meta":830,"navigation":813,"path":531,"seo":831,"status":741,"stem":532,"tags":832,"teaser":741,"__hash__":835},"posts/blog/software-development/how-to-handle-high-loads-on-e-commerce-platform-with-ease.md",[737],{"name":738,"avatar":739},"Oleksandr Gorbunov",{"src":740},"/images/people/oleksandr-gorbunov.webp",null,{"type":743,"value":744,"toc":800},"minimark",[745,749,754,757,761,764,767,771,774,778,781,784,787,790,794,797],[746,747,748],"p",{},"hidden: true",[750,751,753],"h2",{"id":752},"frameworks","Frameworks",[746,755,756],{},"Currently, for our specific use cases, we have implemented two distinct frameworks for our microservices: Django and FastAPI. We employ Django for services that do not experience high loads and require the convenience of Django's built-in admin features. Conversely, FastAPI is our framework of choice for services where the primary focus is achieving rapid response times.",[750,758,760],{"id":759},"databases","Databases",[746,762,763],{},"When it comes to managing the relational databases for our microservices, we've chosen MariaDB, a time-tested, dependable database system that enjoys widespread adoption across the industry. To maintain optimal separation and scalability, we've established dedicated instances of MariaDB for each microservice. This strategy guarantees superior isolation and scalability, affording each microservice its own distinct database for efficient data storage and management.",[746,765,766],{},"In addition to MariaDB, for our NoSQL requirements, we've embraced MongoDB as our solution of choice. Similar to our approach with MariaDB, we've implemented separate MongoDB instances for each microservice, ensuring the flexibility and tailored data management capabilities that each microservice demands.",[750,768,770],{"id":769},"communication","Communication",[746,772,773],{},"For facilitating internal microservice communication, we rely on the NATS messaging system, renowned for its exceptional speed and robustness. When it comes to interfacing with the external world, we opt for the REST protocol, ensuring seamless and standardized communication with external services and clients.",[750,775,777],{"id":776},"development","Development",[746,779,780],{},"As our project continues to expand, we have implemented a valuable tool called \"cookiecutter\" to streamline the process of creating new microservices from standardized templates. Cookiecutter accelerates project initiation by swiftly generating new projects from pre-defined templates, a functionality made accessible through a command-line utility. This tool is particularly well-suited for producing Python package projects and more, enhancing our development efficiency.",[746,782,783],{},"Thanks to Cookiecutter, the creation of new services has become a breeze. With just a simple command, such as make create-django-app or make create-fastapi-app we can instantly initiate new microservices based on our preferred Django or FastAPI templates, saving valuable time and ensuring consistency across our expanding ecosystem.",[746,785,786],{},"As our entire application is designed to operate within a Kubernetes cluster, it's essential to have a seamless local development solution that eliminates the complexities involved. Ideally, we aim for a system that not only simplifies local development but also automates processes such as rebuilding and running the application. To meet these objectives, we've adopted the \"Tilt\" tool.",[746,788,789],{},"Tilt serves as a comprehensive solution, automating every step from the moment code changes are detected to the instantiation of a new process. This encompasses tasks like file monitoring, container image building, and keeping your development environment in sync with the latest code changes. With Tilt in place, our development workflow becomes significantly more efficient, allowing our team to focus on coding and innovation without being bogged down by manual tasks.",[750,791,793],{"id":792},"conclusion","Conclusion",[746,795,796],{},"Anqa Commerce's tech stack, built on these foundations, stands as a testament to the platform's dedication to providing a dynamic, efficient, and scalable e-commerce solution, ultimately enhancing the shopping experience for both customers and vendors.",[746,798,799],{},"‍",{"title":801,"searchDepth":802,"depth":802,"links":803},"",2,[804,805,806,807,808],{"id":752,"depth":802,"text":753},{"id":759,"depth":802,"text":760},{"id":769,"depth":802,"text":770},{"id":776,"depth":802,"text":777},{"id":792,"depth":802,"text":793},"software-development","2023-11-03T00:00:00.000Z","How Anqa Commerce uses a microservice architecture with Django, FastAPI, MariaDB, MongoDB, and NATS to handle high-traffic e-commerce workloads at scale.","md",true,{"src":815},"/images/blog/musictechlab_blog_how-to-handle-high-loads-on-e-commerce-platform-with-ease.webp",{"enabled":813,"items":817},[818,821,824,827],{"text":819,"icon":820},"FastAPI handles high-load services while Django serves admin-heavy, lower-traffic microservices.","i-lucide-zap",{"text":822,"icon":823},"Separate MariaDB and MongoDB instances per microservice ensure isolation and scalability.","i-lucide-database",{"text":825,"icon":826},"NATS messaging handles internal communication; REST serves external API consumers.","i-lucide-message-circle",{"text":828,"icon":829},"Cookiecutter templates and Tilt streamline new microservice creation and local Kubernetes development.","i-lucide-blocks",{},{"title":530,"description":811},[833,834],"ecommerce","devops","7-lq4WYPbdQA-TkqCxZBkGSGP183sH_o5ZlUMHiJol0",[837,839],{"title":526,"path":527,"stem":528,"description":838,"children":-1},"A step-by-step guide to exporting orders from the Saleor.io open-source e-commerce platform to XLSX files using Python packages like openpyxl or xlsxwriter.",{"title":534,"path":535,"stem":536,"description":840,"children":-1},"How we rebuilt a Saleor.io e-commerce store from scratch in 40 hours after a cloud provider disaster, covering deployment, data migration, and lessons learned.",[842,1575,1740,1872],{"id":843,"title":546,"authors":844,"badge":850,"body":853,"category":809,"client":741,"date":1554,"description":1555,"extension":812,"faq":741,"featured":69,"featuredOrder":741,"hidden":69,"image":1556,"keyTakeaways":1558,"meta":1571,"navigation":813,"path":547,"seo":1572,"status":741,"stem":548,"tags":1573,"teaser":741,"__hash__":1574,"score":1205},"posts/blog/software-development/how-we-built-a-notion-backup-tool-in-3-days-with-pythonvue-and-why.md",[845],{"name":846,"to":847,"avatar":848},"Mariusz Smenżyk","https://www.linkedin.com/in/mariusz-smenzyk/",{"src":849},"/images/people/mariusz-smenzyk2.webp",{"label":851,"color":852},"Open Source","#4CAF50",{"type":743,"value":854,"toc":1532},[855,863,866,869,873,876,881,884,889,892,897,900,903,907,910,929,932,936,939,944,947,952,955,960,963,968,971,975,983,989,995,1001,1006,1037,1041,1044,1048,1086,1089,1093,1096,1122,1125,1128,1132,1136,1139,1320,1324,1331,1335,1338,1346,1350,1353,1385,1388,1392,1395,1400,1403,1408,1411,1416,1419,1423,1428,1431,1436,1439,1444,1455,1460,1463,1467,1470,1499,1502,1504,1507,1510,1513,1516,1528],[746,856,857,858,862],{},"At MusicTech Lab, we've used Notion extensively for internal documentation, project management, and knowledge sharing. But we made a strategic decision: ",[859,860,861],"strong",{},"we're moving away from Notion",". Not because it's a bad tool - it's excellent - but because our workflow has evolved.",[746,864,865],{},"We now store project data directly with our clients as a standard practice. Keeping a separate Notion workspace created fragmentation and potential security concerns. But before leaving, we needed to preserve years of accumulated knowledge.",[746,867,868],{},"This is the story of how we built a custom Python tool that exports Notion content to Markdown - and why we're releasing it as open source.",[750,870,872],{"id":871},"why-were-leaving-notion","Why We're Leaving Notion",[746,874,875],{},"Our decision came down to three factors:",[746,877,878],{},[859,879,880],{},"1. Client-first data storage",[746,882,883],{},"We've adopted a policy of storing all project documentation directly in our clients' systems. Whether that's their GitHub, Confluence, or internal wikis - the data lives where the client can access and own it. Maintaining a parallel Notion workspace created duplication and sync headaches.",[746,885,886],{},[859,887,888],{},"2. Data ownership concerns",[746,890,891],{},"As a company working with music industry clients, we handle sensitive business information. Having that data in a third-party SaaS, even one as reputable as Notion, introduced unnecessary risk. Direct client storage means clearer data ownership and simpler compliance.",[746,893,894],{},[859,895,896],{},"3. Reducing tool sprawl",[746,898,899],{},"Every tool in your stack is a potential point of friction. By eliminating Notion and using client-native tools, we reduced context switching and simplified onboarding for new team members.",[746,901,902],{},"But we still had 4000+ pages of internal processes, meeting notes, and institutional knowledge that we couldn't just abandon.",[750,904,906],{"id":905},"the-problem","The Problem",[746,908,909],{},"Notion's native export is... functional, but painful:",[911,912,913,917,920,923,926],"ul",{},[914,915,916],"li",{},"Manual process - no automation possible",[914,918,919],{},"Messy folder structures with random IDs",[914,921,922],{},"Broken image links (Notion URLs expire)",[914,924,925],{},"Lost hierarchy - parent-child relationships disappear",[914,927,928],{},"No frontmatter for static site integration",[746,930,931],{},"We needed a way to extract everything in a format that would remain useful for years - clean Markdown files that could live in Git, be searched easily, and optionally published on our website.",[750,933,935],{"id":934},"the-challenge","The Challenge",[746,937,938],{},"Building a proper Notion export tool revealed several non-obvious challenges:",[746,940,941],{},[859,942,943],{},"Hierarchical structure",[746,945,946],{},"Notion pages can be infinitely nested. The API returns flat lists, not trees. Preserving parent-child relationships for navigation required building our own hierarchy map.",[746,948,949],{},[859,950,951],{},"Rich content types",[746,953,954],{},"Notion has toggles, callouts, databases, embeds, tables, code blocks, and 20+ block types. Each needs specific Markdown conversion logic.",[746,956,957],{},[859,958,959],{},"Expiring media URLs",[746,961,962],{},"Notion's image and file URLs expire after approximately 1 hour. You cannot reference them directly - they must be downloaded and stored locally.",[746,964,965],{},[859,966,967],{},"Database rendering",[746,969,970],{},"Notion databases contain valuable structured information. They needed to be converted to readable Markdown tables with all property types preserved.",[750,972,974],{"id":973},"our-solution","Our Solution",[746,976,977,978,982],{},"We built ",[979,980,981],"code",{},"notion-sync",", a Python CLI tool with three main components:",[746,984,985,988],{},[859,986,987],{},"NotionClientWrapper"," - Handles all API communication with pagination, error handling, and recursive page discovery.",[746,990,991,994],{},[859,992,993],{},"MarkdownBuilder"," - Converts Notion blocks to clean Markdown, downloads assets locally, and generates YAML frontmatter for static site generators.",[746,996,997,1000],{},[859,998,999],{},"sync_notion.py"," - Orchestrates the process and provides a flexible CLI interface.",[1002,1003,1005],"h3",{"id":1004},"key-features","Key Features",[911,1007,1008,1014,1020,1026,1031],{},[914,1009,1010,1013],{},[859,1011,1012],{},"Recursive page crawling"," - Discovers and syncs all nested content automatically",[914,1015,1016,1019],{},[859,1017,1018],{},"Asset downloading"," - Images, PDFs, and videos are saved locally with content-based hashing",[914,1021,1022,1025],{},[859,1023,1024],{},"Hierarchy preservation"," - YAML frontmatter with parent/child relationships",[914,1027,1028,1030],{},[859,1029,967],{}," - Converts to Markdown tables with all property types",[914,1032,1033,1036],{},[859,1034,1035],{},"Flexible CLI"," - Full sync, single page branch, database-only, and test modes",[750,1038,1040],{"id":1039},"tech-stack","Tech Stack",[746,1042,1043],{},"We chose simplicity over cleverness:",[1002,1045,1047],{"id":1046},"sync-tool-python","Sync Tool (Python)",[911,1049,1050,1056,1062,1068,1074,1080],{},[914,1051,1052,1055],{},[859,1053,1054],{},"Python 3.11"," - Excellent for scripting and API work",[914,1057,1058,1061],{},[859,1059,1060],{},"notion-client"," - Official Notion SDK",[914,1063,1064,1067],{},[859,1065,1066],{},"requests"," - HTTP client for asset downloading",[914,1069,1070,1073],{},[859,1071,1072],{},"PyYAML"," - Frontmatter generation",[914,1075,1076,1079],{},[859,1077,1078],{},"python-dotenv"," - Environment configuration",[914,1081,1082,1085],{},[859,1083,1084],{},"Poetry"," - Dependency management",[746,1087,1088],{},"The sync tool is under 700 lines across three files. No async complexity, no heavy frameworks - just straightforward code that's easy to understand and modify.",[1002,1090,1092],{"id":1091},"documentation-site-vue-nuxt","Documentation Site (Vue + Nuxt)",[746,1094,1095],{},"The synced Markdown files power a documentation site built with:",[911,1097,1098,1104,1110,1116],{},[914,1099,1100,1103],{},[859,1101,1102],{},"Vue 3"," - Modern reactive framework",[914,1105,1106,1109],{},[859,1107,1108],{},"Nuxt 3"," - Full-stack Vue framework with excellent DX",[914,1111,1112,1115],{},[859,1113,1114],{},"Nuxt Content"," - Markdown-based CMS that reads our synced files directly",[914,1117,1118,1121],{},[859,1119,1120],{},"Nuxt UI"," - Beautiful, accessible component library",[746,1123,1124],{},"This combination is particularly powerful: Nuxt Content automatically parses our YAML frontmatter and builds navigation from the hierarchy metadata. The synced Markdown files become a fully navigable documentation site with zero additional configuration.",[746,1126,1127],{},"The Vue + Nuxt ecosystem is our go-to for content-heavy sites. It's fast, SEO-friendly, and the developer experience is outstanding.",[750,1129,1131],{"id":1130},"obstacles-we-overcame","Obstacles We Overcame",[1002,1133,1135],{"id":1134},"recursive-block-fetching","Recursive Block Fetching",[746,1137,1138],{},"Notion's API returns blocks without their children. We implemented recursive fetching:",[1140,1141,1145],"pre",{"className":1142,"code":1143,"language":1144,"meta":801,"style":801},"language-python shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","def process_blocks_recursive(blocks_list, indent=0):\n    for block in blocks_list:\n        builder.process_block(block, indent)\n\n        if block.get(\"has_children\", False):\n            child_blocks = notion_client.get_blocks(block[\"id\"])\n            process_blocks_recursive(child_blocks, indent + 1)\n","python",[979,1146,1147,1184,1203,1227,1233,1263,1296],{"__ignoreMap":801},[1148,1149,1152,1156,1160,1164,1168,1171,1174,1177,1181],"span",{"class":1150,"line":1151},"line",1,[1148,1153,1155],{"class":1154},"spNyl","def",[1148,1157,1159],{"class":1158},"s2Zo4"," process_blocks_recursive",[1148,1161,1163],{"class":1162},"sMK4o","(",[1148,1165,1167],{"class":1166},"sHdIc","blocks_list",[1148,1169,1170],{"class":1162},",",[1148,1172,1173],{"class":1166}," indent",[1148,1175,1176],{"class":1162},"=",[1148,1178,1180],{"class":1179},"sbssI","0",[1148,1182,1183],{"class":1162},"):\n",[1148,1185,1186,1190,1194,1197,1200],{"class":1150,"line":802},[1148,1187,1189],{"class":1188},"s7zQu","    for",[1148,1191,1193],{"class":1192},"sTEyZ"," block ",[1148,1195,1196],{"class":1188},"in",[1148,1198,1199],{"class":1192}," blocks_list",[1148,1201,1202],{"class":1162},":\n",[1148,1204,1206,1209,1212,1215,1217,1220,1222,1224],{"class":1150,"line":1205},3,[1148,1207,1208],{"class":1192},"        builder",[1148,1210,1211],{"class":1162},".",[1148,1213,1214],{"class":1158},"process_block",[1148,1216,1163],{"class":1162},[1148,1218,1219],{"class":1158},"block",[1148,1221,1170],{"class":1162},[1148,1223,1173],{"class":1158},[1148,1225,1226],{"class":1162},")\n",[1148,1228,1230],{"class":1150,"line":1229},4,[1148,1231,1232],{"emptyLinePlaceholder":813},"\n",[1148,1234,1236,1239,1242,1244,1247,1249,1252,1256,1258,1260],{"class":1150,"line":1235},5,[1148,1237,1238],{"class":1188},"        if",[1148,1240,1241],{"class":1192}," block",[1148,1243,1211],{"class":1162},[1148,1245,1246],{"class":1158},"get",[1148,1248,1163],{"class":1162},[1148,1250,1251],{"class":1162},"\"",[1148,1253,1255],{"class":1254},"sfazB","has_children",[1148,1257,1251],{"class":1162},[1148,1259,1170],{"class":1162},[1148,1261,1262],{"class":1162}," False):\n",[1148,1264,1266,1269,1271,1274,1276,1279,1281,1283,1286,1288,1291,1293],{"class":1150,"line":1265},6,[1148,1267,1268],{"class":1192},"            child_blocks ",[1148,1270,1176],{"class":1162},[1148,1272,1273],{"class":1192}," notion_client",[1148,1275,1211],{"class":1162},[1148,1277,1278],{"class":1158},"get_blocks",[1148,1280,1163],{"class":1162},[1148,1282,1219],{"class":1158},[1148,1284,1285],{"class":1162},"[",[1148,1287,1251],{"class":1162},[1148,1289,1290],{"class":1254},"id",[1148,1292,1251],{"class":1162},[1148,1294,1295],{"class":1162},"])\n",[1148,1297,1299,1302,1304,1307,1309,1312,1315,1318],{"class":1150,"line":1298},7,[1148,1300,1301],{"class":1158},"            process_blocks_recursive",[1148,1303,1163],{"class":1162},[1148,1305,1306],{"class":1158},"child_blocks",[1148,1308,1170],{"class":1162},[1148,1310,1311],{"class":1158}," indent ",[1148,1313,1314],{"class":1162},"+",[1148,1316,1317],{"class":1179}," 1",[1148,1319,1226],{"class":1162},[1002,1321,1323],{"id":1322},"database-permission-gaps","Database Permission Gaps",[746,1325,1326,1327,1330],{},"Not all databases visible in search are actually accessible for querying. We added a ",[979,1328,1329],{},"--test-database-access"," mode that probes each database before attempting sync.",[1002,1332,1334],{"id":1333},"large-workspace-performance","Large Workspace Performance",[746,1336,1337],{},"Syncing 4000+ pages needed visibility. We added progress bars and timing breakdowns:",[1140,1339,1344],{"className":1340,"code":1342,"language":1343},[1341],"language-text","[=================>              ] 53.2% (213/400)\n\nTiming breakdown:\n   Collecting pages:    12.3s\n   Collecting metadata: 45.2s\n   Syncing pages:       3m 21.5s\n","text",[979,1345,1342],{"__ignoreMap":801},[750,1347,1349],{"id":1348},"results","Results",[746,1351,1352],{},"After 3 days of development:",[911,1354,1355,1361,1367,1373,1379],{},[914,1356,1357,1360],{},[859,1358,1359],{},"4000+ pages synced"," in under 2 hours",[914,1362,1363,1366],{},[859,1364,1365],{},"Zero manual intervention"," - runs via console",[914,1368,1369,1372],{},[859,1370,1371],{},"Full asset backup"," - all images and files stored locally",[914,1374,1375,1378],{},[859,1376,1377],{},"Navigation-ready output"," - integrates with Nuxt Content",[914,1380,1381,1384],{},[859,1382,1383],{},"Complete database support"," - renders as Markdown tables",[746,1386,1387],{},"Our entire Notion workspace is now a Git repository of Markdown files. Searchable, versionable, and completely under our control.",[750,1389,1391],{"id":1390},"why-open-source","Why Open Source?",[746,1393,1394],{},"We're going to release this tool publicly because:",[746,1396,1397],{},[859,1398,1399],{},"1. Others face the same problem",[746,1401,1402],{},"Notion lock-in is real. Whether you're migrating to another tool, need proper backups, or want to publish content statically - the native export doesn't cut it.",[746,1404,1405],{},[859,1406,1407],{},"2. It's not our core business",[746,1409,1410],{},"We're a software development company, not a SaaS vendor. This tool solves our problem and might solve yours too. Open sourcing it costs us nothing and helps the community.",[746,1412,1413],{},[859,1414,1415],{},"3. Community improvements",[746,1417,1418],{},"The tool works for our use case but could be extended. Incremental sync, bidirectional editing, different output formats - contributions are welcome.",[750,1420,1422],{"id":1421},"lessons-learned","Lessons Learned",[746,1424,1425],{},[859,1426,1427],{},"Start with the API documentation",[746,1429,1430],{},"Notion's block structure is more complex than it looks. Reading the docs thoroughly before coding saved refactoring time.",[746,1432,1433],{},[859,1434,1435],{},"Handle expiring URLs immediately",[746,1437,1438],{},"We made downloading assets a core feature from day one. This saved us from discovering the URL expiration issue in production.",[746,1440,1441],{},[859,1442,1443],{},"Build for incremental testing",[746,1445,1446,1447,1450,1451,1454],{},"The ",[979,1448,1449],{},"--limit"," and ",[979,1452,1453],{},"--page"," flags made development fast. Testing with 5 pages instead of 400 is a massive time saver.",[746,1456,1457],{},[859,1458,1459],{},"Simple beats clever",[746,1461,1462],{},"Synchronous, straightforward code over async complexity. The sync runs nightly - saving 30 seconds with async isn't worth the debugging overhead.",[750,1464,1466],{"id":1465},"get-the-tool","Get the Tool",[746,1468,1469],{},"The tool will be available on GitHub shortly. It's designed to be self-contained:",[1471,1472,1473,1483,1486,1493],"ol",{},[914,1474,1475,1476],{},"Create a Notion integration at ",[1477,1478,1482],"a",{"href":1479,"rel":1480},"https://www.notion.so/my-integrations",[1481],"nofollow","notion.so/my-integrations",[914,1484,1485],{},"Share your root pages with the integration",[914,1487,1488,1489,1492],{},"Set up ",[979,1490,1491],{},".env"," with your API key and root page IDs",[914,1494,1495,1496],{},"Run ",[979,1497,1498],{},"poetry run notion-sync",[746,1500,1501],{},"Watch our GitHub for the release announcement.",[750,1503,793],{"id":792},[746,1505,1506],{},"Leaving a tool like Notion after years of use is daunting. The fear of losing institutional knowledge is real. But with the right migration tooling, it becomes manageable.",[746,1508,1509],{},"Our new approach - storing documentation directly with clients - is cleaner and more secure. The Notion export tool ensured we didn't lose anything in the transition.",[746,1511,1512],{},"If you're considering a similar move, or just want reliable Notion backups, the tool is there for you. Fork it, adapt it, contribute back.",[1514,1515],"hr",{},[746,1517,1518],{},[1519,1520,1521,1522,1527],"em",{},"Building developer tools or planning a platform migration? ",[1477,1523,1526],{"href":1524,"rel":1525},"https://musictechlab.io/contact",[1481],"Contact MusicTech Lab"," - we help companies solve complex technical challenges in the music industry.",[1529,1530,1531],"style",{},"html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}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 .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}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":801,"searchDepth":802,"depth":802,"links":1533},[1534,1535,1536,1537,1540,1544,1549,1550,1551,1552,1553],{"id":871,"depth":802,"text":872},{"id":905,"depth":802,"text":906},{"id":934,"depth":802,"text":935},{"id":973,"depth":802,"text":974,"children":1538},[1539],{"id":1004,"depth":1205,"text":1005},{"id":1039,"depth":802,"text":1040,"children":1541},[1542,1543],{"id":1046,"depth":1205,"text":1047},{"id":1091,"depth":1205,"text":1092},{"id":1130,"depth":802,"text":1131,"children":1545},[1546,1547,1548],{"id":1134,"depth":1205,"text":1135},{"id":1322,"depth":1205,"text":1323},{"id":1333,"depth":1205,"text":1334},{"id":1348,"depth":802,"text":1349},{"id":1390,"depth":802,"text":1391},{"id":1421,"depth":802,"text":1422},{"id":1465,"depth":802,"text":1466},{"id":792,"depth":802,"text":793},"2024-12-23T00:00:00.000Z","How we built an automated Notion-to-Markdown sync tool in 3 days, why we left Notion, and why we open-sourced the solution.",{"src":1557},"/images/blog/musictechlab_blog_notion-to-markdown-sync-tool.webp",{"enabled":813,"items":1559},[1560,1562,1565,1568],{"text":1561,"icon":820},"4,000+ Notion pages were synced to Markdown in under 2 hours with a custom Python tool.",{"text":1563,"icon":1564},"Notion image URLs expire after about 1 hour, so assets must be downloaded and stored locally.","i-lucide-clock",{"text":1566,"icon":1567},"Synchronous, simple code beat async complexity for a nightly batch job under 700 lines.","i-lucide-code",{"text":1569,"icon":1570},"Storing docs in client systems eliminated Notion lock-in and simplified data ownership.","i-lucide-lock",{},{"title":546,"description":1555},[776,834],"GWlq_ZfrgW_CtpBmxRBz9fTsuRY4qYgxYGGl3Px8tF0",{"id":1576,"title":682,"authors":1577,"badge":741,"body":1580,"category":809,"client":741,"date":1720,"description":1721,"extension":812,"faq":741,"featured":69,"featuredOrder":741,"hidden":69,"image":1722,"keyTakeaways":1724,"meta":1735,"navigation":813,"path":683,"seo":1736,"status":741,"stem":684,"tags":1737,"teaser":741,"__hash__":1739,"score":1205},"posts/blog/software-development/unifying-artists-and-audiences-exploring-music-glue.md",[1578],{"name":846,"to":847,"avatar":1579},{"src":849},{"type":743,"value":1581,"toc":1715},[1582,1591,1599,1609,1613,1619,1645,1647,1675,1681,1685],[746,1583,1584,1585,1590],{},"MusicTech Lab has partnered with ",[1477,1586,1589],{"href":1587,"rel":1588},"https://www.musicglue.com/",[1481],"Music Glue",", the direct-to-fan e-commerce platform built for the music industry. The partnership lets us recommend and integrate Music Glue's tools for artists, labels, and agents who need a single storefront for merch, music, and tickets.",[1592,1593,1594],"blockquote",{},[746,1595,1596],{},[1519,1597,1598],{},"Music Glue sees big potential in the Central Eastern European market for our solutions. We're hoping teaming up with MusicTech Lab will be a win-win for both of us.",[746,1600,1601,1608],{},[859,1602,1603],{},[1477,1604,1607],{"href":1605,"rel":1606},"https://www.linkedin.com/in/ACoAABMkdFwBj73clgapbNrnBvWOot40YbqjtSA",[1481],"Mark Meharry"," — CEO, Music Glue",[750,1610,1612],{"id":1611},"what-music-glue-does","What Music Glue Does",[746,1614,1615,1618],{},[1477,1616,1589],{"href":1587,"rel":1617},[1481]," enables artists and their teams to sell merchandise, music, and tickets directly to fans worldwide — in one transaction — while retaining full ownership of customer data.",[1620,1621,1628,1633,1637,1641],"div",{"className":1622},[1623,1624,1625,1626,1627],"grid","grid-cols-1","md:grid-cols-2","gap-4","my-8",[1629,1630],"spotlight-card",{"description":1631,"title":1632},"Sell tickets, merch, and music through a single branded storefront. Mobile-ready websites custom-built around the artist's brand, with global distribution and customer support.","For Artists & Managers",[1629,1634],{"description":1635,"title":1636},"Fully managed direct-to-consumer campaigns with real-time reports and sales dashboards to monitor performance.","For Labels",[1629,1638],{"description":1639,"title":1640},"Independent, direct-to-fan ticketing with anti-tout technology, ballot tickets, and VIP solutions — all managed by Music Glue's ticketing team.","For Agents",[1629,1642],{"description":1643,"title":1644},"International distribution centres, localised customer support, and a single dashboard to monitor sales across all stores.","For Merchandise Companies",[750,1646,1005],{"id":1004},[1620,1648,1651,1655,1659,1663,1667,1671],{"className":1649},[1623,1624,1650,1626,1627],"md:grid-cols-3",[1629,1652],{"description":1653,"title":1654},"Direct ticket sales with bundles, ballots, and VIP options. Anti-tout technology keeps tickets in fans' hands.","Ticketing",[1629,1656],{"description":1657,"title":1658},"Exclusive access, subscriber perks, and fan behaviour insights for targeted engagement.","Fan Club",[1629,1660],{"description":1661,"title":1662},"Sustainable custom merch with eco-friendly materials. No excess stock needed.","Print on Demand",[1629,1664],{"description":1665,"title":1666},"Integrate merch displays directly in YouTube channels. Setup takes minutes.","YouTube Merch Shelf",[1629,1668],{"description":1669,"title":1670},"Global chart eligibility with automated reporting to chart companies across multiple countries.","Chart Reporting",[1629,1672],{"description":1673,"title":1674},"International distribution centres across key regions for faster delivery and reduced postage rates.","Global Fulfillment",[1676,1677,1678],"tip",{},[746,1679,1680],{},"Music Glue also offers bundles (merch + album + tickets in one purchase), live streaming with ticket sales, and 24/7 multilingual customer support with an average resolution time under 2 hours.",[750,1682,1684],{"id":1683},"learn-more","Learn More",[1620,1686,1691,1698,1703,1707,1711],{"className":1687},[1688,1689,1690,1627],"flex","flex-wrap","gap-3",[1692,1693],"u-button",{"color":1694,"label":1695,"target":1696,"to":1587,"variant":1697},"primary","Website","_blank","subtle",[1692,1699],{"color":1700,"label":1701,"target":1696,"to":1702,"variant":1697},"neutral","Business Enquiries","https://www.musicglue.com/business-enquiries",[1692,1704],{"color":1700,"label":1705,"target":1696,"to":1706,"variant":1697},"Facebook","https://www.facebook.com/musicglue",[1692,1708],{"color":1700,"label":1709,"target":1696,"to":1710,"variant":1697},"Instagram","https://www.instagram.com/musicglue",[1692,1712],{"color":1700,"label":1713,"target":1696,"to":1714,"variant":1697},"YouTube","https://www.youtube.com/user/musicgluechannel",{"title":801,"searchDepth":802,"depth":802,"links":1716},[1717,1718,1719],{"id":1611,"depth":802,"text":1612},{"id":1004,"depth":802,"text":1005},{"id":1683,"depth":802,"text":1684},"2024-02-28T00:00:00.000Z","Music Glue specialises in creating tailored e-commerce solutions for the music industry. Learn more about MusicTech Lab's partnership with Music Glue.",{"src":1723},"/images/blog/musictechlab_blog_unifying-artists-and-audiences-exploring-music-glue.webp",{"enabled":813,"items":1725},[1726,1729,1732],{"text":1727,"icon":1728},"Music Glue lets artists sell merch, music, and tickets in a single transaction with full data ownership.","i-lucide-music",{"text":1730,"icon":1731},"Anti-tout technology and ballot ticketing keep tickets in fans' hands instead of resellers.","i-lucide-shield",{"text":1733,"icon":1734},"Print-on-demand merch uses eco-friendly materials and eliminates excess inventory risk.","i-lucide-package",{},{"title":682,"description":1721},[1738,833],"musictech","gOslZNjf98FBRPh8lGeT-DCghypBGiX_XE9QEd8oZWQ",{"id":1741,"title":450,"authors":1742,"badge":741,"body":1745,"category":809,"client":741,"date":1852,"description":1853,"extension":812,"faq":741,"featured":69,"featuredOrder":741,"hidden":69,"image":1854,"keyTakeaways":1856,"meta":1868,"navigation":813,"path":451,"seo":1869,"status":741,"stem":452,"tags":1870,"teaser":741,"__hash__":1871,"score":1205},"posts/blog/software-development/dev-meeting-kubernetes-is-a-framework.md",[1743],{"name":846,"to":847,"avatar":1744},{"src":849},{"type":743,"value":1746,"toc":1846},[1747,1751,1754,1757,1772,1776,1787,1794,1798,1815,1824,1828,1835],[750,1748,1750],{"id":1749},"what-is-kubernetes","What is Kubernetes?",[746,1752,1753],{},"Kubernetes (K8s) is a portable, extensible, open-source platform for managing containerised workloads and services. It supports declarative configuration and automation. Google open-sourced the project in 2014, building on over 15 years of experience running production workloads at scale.",[746,1755,1756],{},"The name originates from Greek, meaning \"helmsman\" or \"pilot.\" K8s is shorthand — counting the eight letters between \"K\" and \"s.\"",[1620,1758,1760,1764,1768],{"className":1759},[1623,1624,1650,1626,1627],[1629,1761],{"description":1762,"title":1763},"Automates deployment, scaling, and management of containerised applications across clusters.","Container Orchestration",[1629,1765],{"description":1766,"title":1767},"Define desired state in YAML — Kubernetes ensures the cluster matches it.","Declarative Config",[1629,1769],{"description":1770,"title":1771},"Restarts failed containers, replaces nodes, and reschedules workloads automatically.","Self-Healing",[750,1773,1775],{"id":1774},"googles-problem-with-scale","Google's Problem with Scale",[911,1777,1778,1781,1784],{},[914,1779,1780],{},"Google ran millions of data jobs across datacenters — for search, indexing, and analytics",[914,1782,1783],{},"As the business expanded, managing multiple tenants and diverse workloads became increasingly difficult",[914,1785,1786],{},"They needed a standard way to schedule resources automatically at massive scale",[746,1788,1789,1790,1793],{},"This led to ",[859,1791,1792],{},"Borg",", Google's internal cluster manager — the direct predecessor to Kubernetes.",[750,1795,1797],{"id":1796},"how-kubernetes-was-born","How Kubernetes Was Born",[911,1799,1800,1803,1809,1812],{},[914,1801,1802],{},"Google extracted its resource management approach from Borg into an open-source project",[914,1804,1805,1806],{},"Together with Intel and Red Hat, they founded the ",[859,1807,1808],{},"Cloud Native Computing Foundation (CNCF)",[914,1810,1811],{},"CNCF became the governance body standardising container orchestration and the broader cloud-native ecosystem",[914,1813,1814],{},"Kubernetes quickly became the industry standard for deploying and managing containers",[1676,1816,1817],{},[746,1818,1819,1820,1823],{},"Kubernetes is not just a tool — it's a ",[859,1821,1822],{},"framework",". Through Operators and Custom Resource Definitions (CRDs), teams can extend it to manage any type of workload, from databases to ML pipelines.",[750,1825,1827],{"id":1826},"summary","Summary",[746,1829,1830,1831,1834],{},"Many thanks to ",[859,1832,1833],{},"Marcin Karkocha"," for presenting on Kubernetes at our Dev Meeting. The live demo showed theory in action — deploying and scaling containers in real time.",[1620,1836,1838,1842],{"className":1837},[1688,1689,1690,1627],[1692,1839],{"color":1694,"label":1840,"target":1696,"to":1841,"variant":1697},"Marcin Karkocha on LinkedIn","https://www.linkedin.com/in/mkarkocha/",[1692,1843],{"color":1700,"label":1844,"target":1696,"to":1845,"variant":1697},"Kubernetes Docs","https://kubernetes.io/docs/home/",{"title":801,"searchDepth":802,"depth":802,"links":1847},[1848,1849,1850,1851],{"id":1749,"depth":802,"text":1750},{"id":1774,"depth":802,"text":1775},{"id":1796,"depth":802,"text":1797},{"id":1826,"depth":802,"text":1827},"2023-01-05T00:00:00.000Z","Exploring Kubernetes as a framework: from Google's scaling challenges and Borg to Operators, CRDs, and modern container orchestration basics.",{"src":1855},"/images/blog/musictechlab_blog_dev-meeting-kubernetes-is-a-framework.webp",{"enabled":813,"items":1857},[1858,1860,1863,1865],{"text":1859,"icon":829},"Kubernetes evolved from Google's internal Borg system after 15+ years of production use.",{"text":1861,"icon":1862},"It is a framework, not just a tool. CRDs and Operators extend it to any workload.","i-lucide-layers",{"text":1864,"icon":1731},"Self-healing: auto-restarts failed containers and reschedules workloads across nodes.",{"text":1866,"icon":1867},"CNCF governs Kubernetes and the broader cloud-native ecosystem.","i-lucide-globe",{},{"title":450,"description":1853},[834,776],"RcS-TiAWU6Us-_9EdUKIrZKVB0qAQggp7AK2p-0wOAo",{"id":1873,"title":354,"authors":1874,"badge":741,"body":1879,"category":809,"client":741,"date":2000,"description":2001,"extension":812,"faq":741,"featured":69,"featuredOrder":741,"hidden":69,"image":2002,"keyTakeaways":2004,"meta":2017,"navigation":813,"path":355,"seo":2018,"status":741,"stem":356,"tags":2019,"teaser":741,"__hash__":2021,"score":1205},"posts/blog/software-development/automate-repetitive-tasks-to-improve-your-business-performance.md",[1875],{"name":1876,"avatar":1877},"Jurek Skowron",{"src":1878},"/images/people/jurek-skowron.webp",{"type":743,"value":1880,"toc":1993},[1881,1884,1888,1891,1902,1905,1908,1912,1915,1930,1933,1936,1940,1954,1958,1961,1964,1967,1981,1985,1988],[746,1882,1883],{},"As it was presented in the previous article, people and organizations benefit from repetition because of its importance in learning. But there is also a negative kind of repetition, hurting individuals and organizations. You can deal with dull repetitive tasks by reorganizing them. Nowadays, digital work and processes are ubiquitous for many of us, therefore, automation of digital tasks is also a powerful tool. There are services, like Zapier, which provide you a way to create automation workflows and integrate various computer tools, with no programming required.",[750,1885,1887],{"id":1886},"dealing-with-repetitive-tasks","Dealing with repetitive tasks",[746,1889,1890],{},"There are some ways to deal with tasks, which turn us, or our employees into mindless zombies. Some of the solutions are:",[911,1892,1893,1896,1899],{},[914,1894,1895],{},"altering routines,",[914,1897,1898],{},"delegating tasks to contractors and virtual assistants,",[914,1900,1901],{},"recycling projects using templates, organizing flows for such tasks, with setting daily reminders, milestones, and deadlines.",[746,1903,1904],{},"Some essential tasks can’t be delegated, then the only way is to figure out how to make them more enjoyable.",[746,1906,1907],{},"But in today’s digital world, we are also equipped with a powerful tool, or better to say, the wide range of tools provided by automation.\nArtificial intelligence is the present, and businesses are adopting it. But it is not just AI. There are many more ways to benefit from automation.\nAutomation is an example of how technology has fundamentally changed the way we live and work. We use it every day, e.g., when using auto-paying bills, creating calendar notifications, even setting a washing machine or coffee pot.\nFor work, nowadays, there are many code boilerplates, scripts, applications, macros, etc., which are convenient solutions for many monotonous jobs.",[750,1909,1911],{"id":1910},"automation-of-digital-tasks-on-your-own","Automation of digital tasks on your own",[746,1913,1914],{},"Not always, there is a ready solution for the automation of digital tasks. Then, in many cases, we can construct our own. If you think “code!” programming your solution - yes. But wait! Only sometimes.",[746,1916,1917,1918,1923,1924,1929],{},"I am sure you are acquainted with ",[1477,1919,1922],{"href":1920,"rel":1921},"https://en.wikipedia.org/wiki/Jeff_Atwood",[1481],"Jeff Atwood’s"," quote ",[1477,1925,1928],{"href":1926,"rel":1927},"https://news.ycombinator.com/item?id=10979240",[1481],"“the best code is no code at all”",". Reinventing the wheel is a good idea when you are learning how the wheel works or trying to disrupt the wheel technology. But for productivity, whenever possible, it is better to use a wheel already made, well tested in various scenarios. And to focus on this part of our job that adds value, changes/ saves the world, earns money (whatever your reasons and motivation). Thus, getting back to automating tasks before coding your solution, you should consider an easier and faster way.",[746,1931,1932],{},"It brings us to automation tools that connect different applications and services without coding or relying on developers to build the integration. Using these tools resembles building with Lego bricks. They provide us functional blocks that you can join and combine into your integration workflows. Among these services are Zapier, Automate.io, Integromat, IFTTT, and many more.",[746,1934,1935],{},"In the next article, I will show a use case of an automation task I solved for MusicTech Lab. After research, I decided to use Zapier to integrate Slack with Google Drive/Docs/Sheets. Let me briefly introduce the tool.",[750,1937,1939],{"id":1938},"what-is-zapier","What is Zapier?",[746,1941,1942,1943,1948,1949,1953],{},"In my research on how to automate the task I was given (I will elaborate on it in the next article), I found that the most common solution is to use ",[1477,1944,1947],{"href":1945,"rel":1946},"https://zapier.com/",[1481],"Zapier",". As you can read on ",[1477,1950,1952],{"href":1945,"rel":1951},[1481],"its website",",* \"Zapier is an online automation tool that connects your apps and services. You can connect two or more apps to automate repetitive tasks without coding or relying on developers to build the integration.\"*\nI have also found Zapier as easy to use and experiment with. What is more, it offers a free plan and gives us a 14-day trial of the premium plan, which enables us to check whether it is the right tool for our needs.",[750,1955,1957],{"id":1956},"creating-a-zap","Creating a Zap",[746,1959,1960],{},"In Zapier, you create Zaps, which are workflows containing two or more steps. You can create your Zaps or use some already predefined in Zapier.",[746,1962,1963],{},"Here you can see the overview of Zap I created:",[746,1965,1966],{},"As you can see on the screenshot, steps are visually represented as boxes, representing functional blocks, which you join to create a workflow. Every phase is configurable, with options specific to its type and application it handles. You can use actions related to specific applications (e.g., Google Docs, Slack, Todoist) or special helpers (for actions like conditions, delays, changing how data is formatted, or even adding your Python or JavaScript code).",[1620,1968,1970,1973,1977],{"className":1969},[1623,1624,1650,1626,1627],[1629,1971],{"description":1972,"title":1947},"The most popular no-code automation tool. Connects 5,000+ apps.",[1629,1974],{"description":1975,"title":1976},"Simple \"if this, then that\" automation. Great for personal workflows.","IFTTT",[1629,1978],{"description":1979,"title":1980},"Advanced visual workflows with branching logic and error handling.","Make (Integromat)",[750,1982,1984],{"id":1983},"a-use-case-at-musictech-lab","A Use Case at MusicTech Lab",[746,1986,1987],{},"Zapier is not the only automation service for digital tasks, but it was a great fit for the Slack + Google Drive/Docs/Sheets integration we built at MusicTech Lab.",[1676,1989,1990],{},[746,1991,1992],{},"Automate to have more time for people and things that matter. The best automation is the one you set up once and forget about.",{"title":801,"searchDepth":802,"depth":802,"links":1994},[1995,1996,1997,1998,1999],{"id":1886,"depth":802,"text":1887},{"id":1910,"depth":802,"text":1911},{"id":1938,"depth":802,"text":1939},{"id":1956,"depth":802,"text":1957},{"id":1983,"depth":802,"text":1984},"2020-09-18T00:00:00.000Z","Repetitive work may negatively impact your business performance. By improving business performance management, you can automate tasks and increase productivity.",{"src":2003},"/images/blog/musictechlab_blog_automate-repetitive-tasks-to-improve-your-business-performance.webp",{"enabled":813,"items":2005},[2006,2009,2011,2014],{"text":2007,"icon":2008},"No-code tools like Zapier connect 5,000+ apps without writing any code.","i-lucide-wrench",{"text":2010,"icon":820},"Automation frees time for high-value work instead of repetitive digital tasks.",{"text":2012,"icon":2013},"Zapier offers a free plan and 14-day premium trial to test your workflows.","i-lucide-dollar-sign",{"text":2015,"icon":2016},"Before coding a custom solution, check if an existing integration already exists.","i-lucide-lightbulb",{},{"title":354,"description":2001},[2020,834],"outsourcing","H2Jc2Rn6O331reRfA8Os8TbRIxs6HZFRoPVxaPuFPbc",1780305323299]