{"id":1789,"date":"2025-06-22T13:47:36","date_gmt":"2025-06-22T10:47:36","guid":{"rendered":"https:\/\/wrong.digital\/?post_type=works&#038;p=1789"},"modified":"2025-07-23T10:50:53","modified_gmt":"2025-07-23T07:50:53","slug":"lmt-light-choreography-with-20000-synchronized-phones","status":"publish","type":"works","link":"https:\/\/wrong.digital\/en\/works\/lmt-light-choreography-with-20000-synchronized-phones\/","title":{"rendered":"LMT &#8211; Light choreography with 20,000 synchronized phones"},"content":{"rendered":"<?xml encoding=\"utf-8\" ?><blockquote>\n<p class=\"p1\"><b>A light choreography with 20,000 synchronized phones<\/b><b><\/b><\/p>\n<p class=\"p3\">Let&rsquo;s be honest &mdash; yes, Coldplay&rsquo;s glowing wristbands inspired us.<\/p>\n<p class=\"p3\">But the idea of thousands of battery-powered devices that would later need to be collected, stored, maintained, and babysat&hellip; felt overly complicated and not exactly eco-friendly.<\/p>\n<p class=\"p3\">So, we turned to something everyone already has in their pocket &mdash; their own phone.<\/p>\n<p class=\"p3\">At first, the idea seemed simple. But then came the big challenge: <span class=\"s1\"><b>synchronization<\/b><\/span>.<\/p>\n<p class=\"p3\">How do you get 20,000 phones to light up in perfect unison?<\/p>\n<p class=\"p3\">We explored a few options:<\/p>\n<ul>\n<li>\n<p class=\"p1\">Microphone-based sync (detecting a high-frequency audio code)<\/p>\n<\/li>\n<li>\n<p class=\"p1\">Camera-based sync (triggering from a visual &ldquo;cue image&rdquo;)<\/p>\n<\/li>\n<li>\n<p class=\"p1\">And syncing via <span class=\"s1\"><b>global time<\/b><\/span>.<\/p>\n<\/li>\n<\/ul>\n<p class=\"p3\">For a long time, we clung to the microphone idea &mdash; like a sound-driven equalizer. But it didn&rsquo;t deliver the control we needed. The result felt unpredictable and difficult to choreograph precisely.<\/p>\n<p class=\"p3\">So we switched to a solution based on global time and our own sync checkpoints.<\/p>\n<p class=\"p3\">This approach let us match lights to music and its dynamics with much greater precision &mdash; and without needing access to the phone&rsquo;s camera, mic, or anything else intrusive.<\/p>\n<p class=\"p3\">But that introduced a new challenge: <span class=\"s1\"><b>concerts are fluid<\/b><\/span>. It&rsquo;s rare that a song starts exactly at &ldquo;21:07, sharp.&rdquo;<\/p>\n<p class=\"p3\">Also, to know <i>when<\/i> to start, each device needs to ask our server: &ldquo;Is it time now?&rdquo;<\/p>\n<p class=\"p3\">If 20,000 phones do that simultaneously&hellip; it&rsquo;s basically a DDoS attack. Unintentional &mdash; but still.<\/p>\n<p class=\"p3\">After many conversations with LMT&rsquo;s network engineers and security teams, we realized this kind of load isn&rsquo;t something well-documented globally. There&rsquo;s no clear &ldquo;safe limit&rdquo; to rely on.<\/p>\n<p class=\"p3\">So we created a solution: devices were split into &ldquo;batches,&rdquo; each checking in at slightly different moments.<\/p>\n<p class=\"p3\">This drastically reduced the load, while still keeping everyone perfectly in sync.<\/p>\n<p class=\"p3\">Right before the show, we updated all devices with our master time cue &mdash; and the magic happened.<\/p>\n<p class=\"p3\">We also optimized the web app down to just <span class=\"s1\"><b>180 KB<\/b><\/span>!<\/p>\n<p class=\"p3\">Multiplied by 20,000 users, that&rsquo;s around <span class=\"s1\"><b>3.43 GB<\/b><\/span> of data &mdash; not bad at all.<\/p>\n<p class=\"p3\">To make choreography easy, we also built a custom <span class=\"s1\"><b>light control panel<\/b><\/span>, allowing us to mix effects like <span class=\"s1\"><b>solid<\/b><\/span>, <span class=\"s1\"><b>strobe<\/b><\/span>, <span class=\"s1\"><b>gradient<\/b><\/span>, and <span class=\"s1\"><b>random<\/b><\/span>. It gave us near-millisecond control over the show&rsquo;s rhythm and feel.<\/p>\n<p class=\"p3\">Huge thanks to the creative father of the concert, <a href=\"https:\/\/www.instagram.com\/papa_chi_\/\"><span class=\"s1\"><b>Papa Chi<\/b><\/span><\/a>, to the mastermind behind the code, <span class=\"s1\"><b>Rihards Gr&#257;vis<\/b><\/span> (who, by the way, also has deep roots in the mushroom business &mdash; <a href=\"https:\/\/spora.lv\">https:\/\/spora.lv<\/a>), and to the <span class=\"s1\"><b>LMT marketing, security, and engineering teams<\/b><\/span> for making this innovation possible!<\/p>\n<\/blockquote>\n","protected":false},"featured_media":0,"template":"","work-category":[70,73,91,85,72,67],"fillter-category":[60,59,51],"clients":[63],"class_list":["post-1789","works","type-works","status-publish","hentry","work-category-brand-content-en","work-category-motion-graphics-en","work-category-phygital-experiments","work-category-programming","work-category-research-en","work-category-web-en","fillter-category-creative-solutins","fillter-category-experiments-fun","fillter-category-web-development-en","clients-lmt-en"],"acf":[],"_links":{"self":[{"href":"https:\/\/wrong.digital\/en\/wp-json\/wp\/v2\/works\/1789","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wrong.digital\/en\/wp-json\/wp\/v2\/works"}],"about":[{"href":"https:\/\/wrong.digital\/en\/wp-json\/wp\/v2\/types\/works"}],"wp:attachment":[{"href":"https:\/\/wrong.digital\/en\/wp-json\/wp\/v2\/media?parent=1789"}],"wp:term":[{"taxonomy":"work-category","embeddable":true,"href":"https:\/\/wrong.digital\/en\/wp-json\/wp\/v2\/work-category?post=1789"},{"taxonomy":"fillter-category","embeddable":true,"href":"https:\/\/wrong.digital\/en\/wp-json\/wp\/v2\/fillter-category?post=1789"},{"taxonomy":"clients","embeddable":true,"href":"https:\/\/wrong.digital\/en\/wp-json\/wp\/v2\/clients?post=1789"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}