By Benjamin Abramovitch
The long path from a small side project to a platform built for every festival.
In 2015 I stepped into my first professional role as an Android Developer. I had already built an app inspired by Shambhala Music Festival, and I wanted a side project that would let me dig into new Android ideas and keep growing beyond my day to day work.
After years of going to Shambhala and wishing there was a proper mobile schedule, I finally decided to build one myself. It was something I wanted for my own experience, but I also knew thousands of other people would benefit from it.
I had tried enough festival apps at that point to know what worked and what did not, and a lot of them felt more complicated than they needed to be. Using that experience as a guide, I built my own version and released ShambaTimes before Shambhala 2015.
The response was incredibly encouraging, and people kept asking for more features and improvements. So each year I would come back to it, adding little things along the way based on the feedback I was getting.
When Shambhala eventually decided they wanted an official app, they invited me to pitch, but ultimately chose a more established company because I did not yet have an iOS version. I kept going anyway and built the iOS app, releasing ShambaTimes again with a new advanced grid screen that rivaled the best festival schedule layouts available at the time, and that I still think is one of the strongest grid experiences out there today.
The feedback stayed incredibly positive, with many users saying they still preferred it over the official app, so I continued improving it each year based on the feedback people sent in.
When covid hit and festivals paused, I took a break from the project. Before they returned I decided to rebuild ShambaTimes using everything I had learned as a developer, rewriting it in Kotlin and adding technical improvements that would make it easier to sell someday.
I was able to fix all the lingering issues from my early codebase, and the app was a great success in 2022. Around then I also wanted to rebuild the iOS app using modern tooling, since it had not been updated in years due to covid and no longer matched the architecture of the Android version. So for a couple of years there was no iOS app, but when Kotlin Multiplatform for iOS entered Alpha, I decided to see how hard it would be to make the Android app run on iPhones. The conversion ended up being surprisingly easy, just tedious, and by 2024 I once again had both Android and iPhone apps, now sharing the same code.
Once the Android and iOS apps were modernized and easy to maintain, and with years of feedback from people who continued to use my version over the official one, I began building a desktop administration backend. I needed a place with more room to manage everything so the app could be used for other festivals as well.
This is when Dancing Decibels truly began. In 2025 I rebranded and launched the mobile apps as a multi festival app, with not only Shambhala’s unofficial schedule but also the schedules of other festivals I attended that year to demonstrate how it could support multiple events.
That same year Woodstove Music and Arts Festival used the administration software to manage their event and gave very positive feedback about how well it worked for them and how well the mobile app was received by their guests.
This is where the next part of my journey begins. I want Dancing Decibels to be accessible to everyone and to grow into more than a festival app for guests. My goal is to build something that supports events of any size in a way that feels simple, reliable, and easy to use.
It's about to get nerdy
This section explains how the platform works under the hood and the engineering choices that make it fast, reliable, and easy to maintain.
Dancing Decibels is built using Kotlin Multiplatform and Compose Multiplatform, which allows me to reuse the same logic and UI code across desktop and mobile. For example, drag and drop scheduling uses the same shared logic on desktop, Android, and iOS, adapting itself to different screen sizes without needing separate implementations.
The Android and iOS apps are both fully native applications. The iOS version is compiled into native iOS binaries and calls system APIs directly, with a custom Skia rendered UI instead of UIKit or SwiftUI. The desktop app for Windows, Mac, and Linux is built as a JVM application using the same shared Kotlin code.
Compose Multiplatform also supports the WebAssembly (WASM) target. Once the tooling I rely on fully supports it, I plan to offer the application as a web app as well.
Because all platforms share the same Compose code, I can do things like embed the mobile app directly inside the desktop administration app. This gives organizers a real preview of the actual Android and iOS app as they add content, using the exact same code that runs on mobile devices.
The backend uses Firebase Firestore. All administration work happens in a draft section where organizers can enter their event information before publishing it.
When organizers publish their event, the draft content is copied into the live section of the service. At the same time, the entire event is exported to Cloudflare R2, which is backed by the Cloudflare CDN. Instead of serving large numbers of individual Firestore documents to attendees, I serve a single cached JSON file that is delivered from Cloudflare's Edge Network as close to their device as possible.
Whenever a change is published, such as adding a new artist or updating the FAQ, the event is republished and the cache is purged using Cloudflare Instant Purge. At the same time, the mobile apps are alerted through a Firebase change listener and a push notification so guests know that new information is available.
If an attendee’s device has been opened recently, it listens for changes in the background. If it has not been opened, it detects updates the next time the app launches and fetches the new content from Cloudflare R2. The change listener includes the latest version number, and if the Cloudflare data is out of sync or unavailable, the app fetches the updated content from Firebase instead. This provides a redundant fallback so updates can still be delivered even if Cloudflare is unavailable.
The mobile app is designed to be fully offline first after the event is loaded. All event data is stored locally, so everything loads instantly without needing a network connection. When the device does have internet, updates are fetched quietly in the background rather than blocking anything, which means performance stays the same whether someone is offline, online, or in bad reception.
The same JSON data is also used to generate a static webpage for the event. Using Cloudflare Workers, an endpoint like myevent.dancingdecibels.com fetches the cached JSON and returns the full page in a single request with no additional page loads. Organizers can also access this JSON directly if they want to build their own custom webpage instead of using the provided one.
This makes the webpage extremely fast for anyone who wants to view it directly or embed the lineup and schedule on their own site. In the future, I hope to generate this page from the same codebase as the desktop and mobile apps, but for now it is a simple HTML and JavaScript page.
There is still a lot more I want to build, but this architecture gives me a solid foundation to keep improving the platform over time.
At Dancing Decibels, we make event tech affordable for festivals big or small.
We charge event organizers the full-price regular admission cost to attend all days of the event. If your event includes early entry with scheduled programming, that day is included in the price.
For events over 50,000 attendees or to verify free event eligibility, contact [email protected]. Our goal is to remain affordable at any size.
Free to explore. Pay only when you want to publish.
*with programming
Create, Manage, and Launch your live entertainment experience, from intimate community gatherings to major music festivals.
Simple. Fast. Scalable.
Download and Start Building → Try the interactive demo. No signupCreate your event with a few clicks.
Keep everything updated from desktop or mobile
Launch your website and app with a single click.