The Theater That Stopped Ringing
How I fixed my ex-boyfriend’s movie theater and accidentally built a case study
For nearly three years, if you called O Cinema in Miami, you got nothing. Not a voicemail. Not a “we’ll call you back.” Just dead air. Like calling into the void, except the void was a small independent movie theater in Wynwood trying to survive on vibes and grant money.
My ex-boyfriend—we’re on good terms, it’s fine, this isn’t that kind of story—founded the place back in the day, though he’s since handed over day-to-day operations to his co-founder, Vivian. And at some point during one of our periodic check-ins, he mentioned in passing that their phone hadn’t worked in three years.
“Three years?” I said.
“Yeah, we just tell people to email us.”
I stared at my phone. “You run a business in Miami. A city where 70% of the population speaks Spanish at home. And your customer service strategy is ‘email us’?”
“...yeah?”
So naturally, I did what any reasonable person with too much free time and a working knowledge of serverless architecture would do: I built them an AI voice agent that answers calls 24/7 in multiple languages for roughly the cost of a decent dinner out.
Look, I’m not saying this makes me a good person. I’m saying I’m the kind of person who sees a problem and thinks, “I bet I could solve this with Redis caching and some questionable life choices.”
The Problem Was Worse Than “Phone Doesn’t Work”
Here’s what “no working phone” actually meant for the business:
Lost revenue. Tourists don’t email. Old people don’t email. People who just want to know if there’s parking definitely don’t email. They call. And when they call and get nothing? They go see a blockbuster at the corporate multiplex instead.
Accessibility disaster. Email-only, English-first contact for a theater in Miami is like opening a taco truck that only accepts Bitcoin. Technically possible, but you’re eliminating most of your potential customers through sheer incompetence.
Staff Email hell. The staff was drowning in the same five questions over and over: “What’s playing?” “Where do I park?” “Do you sell popcorn?” (What question is that? Why wouldn’t a theater sell popcorn?)
So yeah. Not great.
What I Built (And Why It Was Probably Overkill)
I spent three weeks building a voice AI system that:
Answers calls 24/7 in English and Spanish (Haitian Creole support is... pending, let’s say)
Pulls real showtime data from their ticketing system every 30 minutes.
Takes voicemails, transcribes them, and emails them to staff.
Has a web dashboard that lets staff manage everything without a computer science degree.
Tech choices were driven entirely by “this needs to run itself because I don’t want to be on call for a movie theater”:
Vercel serverless functions (no servers to babysit)
ElevenLabs (because the AI voice needs to sound human, not like a depressed GPS)
Twilio (for the actual phone number and call handling)
Upstash Redis (because I’m not hitting a slow ticketing API 10,000 times a day)
Monthly cost: $35-43.
For reference, a part-time receptionist would cost them around $2,400/month. So this is either genius or proof that I dramatically undervalue my time. Probably both.
The Part Where I Discovered I’m Still Bad At This
Bug #1: The AI Started Hallucinating Showtimes
Week one, everything’s great. Week two, the AI starts telling people showtimes that are off by several hours. Incredible. Really instills confidence in the technology. Turns out: classic timezone double-conversion bug. The API sends times in Eastern Time. My code also converts to Eastern Time. Math is hard. Fixed it in four hours.
Bug #2: Voicemails Were Disappearing Into The Ether
Worked perfectly in testing. Completely failed in production. The developer’s natural habitat. The issue: Vercel’s production proxy servers modify request headers, breaking Twilio’s security validation. The system was correctly rejecting legitimate voicemails as forgeries. Doing its job! Just... the wrong job. Spent half a day reconstructing validation URLs with `X-Forwarded-Host` headers and cursing cloud infrastructure. Or as I called it at the time, “Thursday.”
Bug #3: The Ticketing API Was Slow Enough To Make People Hang Up
The third-party API took 3-5 seconds to respond, which doesn’t sound like much until you’re on a phone call with an AI and there’s just... dead air. People were hanging up. Can’t blame them. Solution: Redis caching layer. Refresh every 30 minutes with a cron job. Response time dropped from 3-5 seconds to under 100ms. Problem solved through the ancient developer tradition of “just cache everything.”
The Resolution
Before: No phone. Email-only support. Entire demographics are unable to reach them. Staff wasting hours answering “what’s playing tonight?”
After: 24/7 voice agent. Instant answers in two languages. Staff are freed up to do literally anything else.
Vivian—who actually runs the theater now—was kind enough to let me use her quote:
“We’d been without a working phone system for three years. When people called O Cinema, they got... nothing: no ring, no voicemail, just silence. For a theater that prides itself on accessibility and inclusion, that was embarrassing.
Ernie didn’t just fix the problem—he gave us something better. Now we have a voice agent that answers calls 24/7 in English and Spanish, tells people what’s playing, and even takes voicemails with automatic transcription. It costs us about $35 a month and runs itself.
What I loved about working with Ernie was how quickly he moved—three weeks from our first conversation to having it live. When we found a bug, he fixed it the same day. He explained everything in plain English, never making us feel like we needed a computer science degree to understand what he was building.”
— Vivian Marthell, CEO & Co-Founder, O Cinema
And in the end, the board was so relieved to have this three-year headache gone that they insisted on providing an honorarium—a powerful testament to the value of having a translator who can bridge the gap between a real-world problem and a technical solution.
(For a detailed breakdown of the technical implementation, including system diagrams and code snippets, you can view the full Technical Appendix.)
So, Why Am I Telling You This?
Mostly because I needed to write about this somewhere, and putting “fixed my ex’s phone system” on a resume just seems kinda weird?
But also: I think there’s something worth noting about the gap between “this seems impossible” and “actually you can just build it for $40/month.” Small organizations—arts nonprofits, independent businesses, community groups—operate under the assumption that professional-grade tech is out of reach. And usually they’re right, because the tech industry has convinced everyone that simple problems require $50K solutions and a six-month timeline.
Sometimes you can just... build the thing.
Is this me trying to get freelance work? Maybe? I honestly don’t know anymore. I’m 49, living in a condo partially purchased by my father, caring for aging parents, and apparently, my hobbies now include “solving infrastructure problems for my ex’s movie theater.”
It’s not the life plan I had, but then again, what is?
If you want me to build you something: e@erniehsiung.com.
If you just want to read about my ongoing identity crisis: Um, you’re already subscribed. Thanks for that.



Brilliant problem solving, real world, real time .very cool!
There are old people in Miami? And Spanish speakers, too? I swear, the things I learn here never cease to amaze me!
Seriously, my friend, you're amazing. Not just because you solved this for the theater--although what you did is impressive--but because of how you did it and what a difference you're making. I wish I could think of another place that needs this kind of work. If I do--and I'll mention this to Marc, too--I'll definitely try to make a connection. But for dog's sake, charge them some bucks, please!