inhales sharply GOOOOOOOOOOOOALLLLL THREEEEE! 🇺🇸 ⚽️
On This Day
This post originally appeared in my Techish newsletter on LinkedIn.
From a young age, I’ve always loved the magical experience of going to the movies. Torn ticket stubs, big booming sound, giant screens, and popcorn fill my heart with joy. There is nothing in the world quite like sharing in the community experience of enjoying a blockbuster in a movie theater. I suppose it's no surprise that I’ve loved living in LA so much!
Since 2020, theaters have struggled quite a bit, and for good and obvious reasons. I’ve truly missed taking my family to the theater. I’m a bit of a digital packrat, with a healthy collection of Blu-Rays stored on my home NAS. About a year ago, I finished renovating my home theater, which was a big step toward recapturing the magic of the movies with my family. But, no matter how great the picture and sound are, I still felt something was missing.
If you’ve been following me, you’ll be unsurprised to hear that I decided to scratch my itch with technology. What better way to explore the emerging and promising power of GenAI while honing my skill with HTML, CSS, JavaScript, and WebSockets?
Part of visiting a movie theater is walking by a wall of big, colorful movie posters, which are, in my view, an underappreciated art form. A great movie poster creates a sense of excitement, anticipation, and wonder. A few months ago I stumbled on a project called Movie Posters Perfected, which was a huge inspiration for this project. While I could have gone down the path of just showing movie posters from this curated collection using a Fire TV stick, I wanted to create something even more magical. So, armed with inspiration, I set to the task of creating what I call my “Magic Poster.”
The hardware ingredients for the Magic Poster are simple:
Assembly was straightforward, thanks to double sided tape and zip ties. The one piece of hardware I wouldn’t use again is the Samsung monitor, which is a little too “smart” for it's own good. Getting it to be happy in portrait orientation was a nightmare! Still, I soldiered on and was able to mount the TV on the wall and drive the display with my Raspberry Pi 5, with the LED backlight matching the content on screen. Now, it was time to build some software.
While Raspberry Pis have become surprisingly powerful, they are still constrained computers with limited performance. I knew that I wanted to do more than just display static posters. I wanted to enhance the magic factor with animations, context awareness, and generative AI. When it comes to rendering performance, modern web browsers have decades of optimization, hardware acceleration, and features. I decided that my best bet was to use Chromium in “kiosk” mode, which displays websites in full screen, free of window decorations, toolbars, and tabs.
For the backend, I chose my programming language of choice, Python, along with libraries like Flask and SocketIO. Magic Poster is a JavaScript-powered frontend that communicates with a Python backend using WebSocket. I deployed modern CSS animations and transitions to create delightful views that can scroll, flip, and fade in and out.
After a few weeks of insomnia-fueled development, I had Magic Poster serving up beautiful posters from a hand-picked set of over 1,200 high-resolution movie posters, with four different styles: single poster, a “marquee” view with dozens of small animated posters, a “scroll” view that shows medium sized posters with a smooth scrolling animation, and a “flip” view that experiments with animation that really make the LED backlight sing.
One of the benefits of powering Magic Poster with a network attached Raspberry Pi is that it can integrate with other systems on my home network. In my theater, I have an Apple TV 4K, a Zidoo Z9X and a gaming PC running ChimeraOS. Thanks to open APIs, I am able to detect when I am watching a movie or show, or when a game is being played. Using these APIs, I was able to have a small overlay appear on Magic Poster that displays information about the current activity.
Magic Poster was really taking shape, with a variety of different modes, context awareness, and even a simple REST API for controlling what is on screen at any given time. Still, I felt that there was something missing: interactivity. With the rapid and accelerating evolution of AI, there was an opportunity to take Magic Poster to the next level.
Interactivity requires two-way communication. Attaching a keyboard or physical buttons to Magic Poster would be an easy path to providing input, but buttons are decidedly un-magical. I wanted Magic Poster to have a personality – to feel alive. Technology has an opportunity to become increasingly personal and interactive thanks to AI, and I concluded that the most magical way to interact with Magic Poster would be through conversation. Could I simply speak to Magic Poster, and more importantly, have Magic Poster respond?
Voice assistants have been “a thing” for quite some time. My experience with the three major players (Apple’s Siri, Google, and Amazon’s Alexa) have been mixed at best. All three assistants require “wake words” to begin an interaction, which feels forced. In the years since these assistants were developed, technology has evolved and advanced significantly. If possible, my goal was to have conversations with Magic Poster feel more natural.
As a longtime member of the Python community and a Fellow in the Python Software Foundation, I follow a number of prominent community members. Simon Willison is a Python developer that has become deeply interested in AI and LLMs, producing some great tools including Datasette, and more recently, Python LLM, which makes using both local and hosted LLMs from Python fun and easy. Through Simon, I discovered Vosk, which is an open source ML powered speech recognition toolkit with impressive accuracy and a very small footprint. I was quickly able to leverage Vosk to have Magic Poster passively listening to me in the background, ready to respond or take action based upon my feedback, including changing views, requesting specific posters, and more.
Now that Magic Poster could listen and take action, I wanted to give it the power to respond in its own voice. One of my favorite sites on the web is The Movie Database (TMDb), which is a free platform chock full of features, including an API with excellent Python client libraries. TMDb contains a lot of user-generated content, including a large number of reviews, with useful insights from a broad range of people. I decided to give Magic Poster the power to take hundreds of user reviews to generate a short summary of audience sentiment. When requested, Magic Poster reached out to The Movie Database, quickly pulls down all of the reviews for a movie, and then generates a summary using Ollama and the Llama 3 LLM. Finally, I feed the generated content to a text-to-speech system, and Magic Poster finally has a voice.
It's been a lot of fun working on Magic Poster, and I am really happy with where it stands today. Of course, I have so many ideas about where to go from here, with additional voice features, display styles, and more. What do you think about Magic Poster? Do you have any suggestions for how to make it even more magical? Talk soon!
John Oliver discusses the ongoing elections in India, Trump's guilty verdict, and the decline of Red Lobster.
Watched on Trakt
The Verge’s Nilay Patel, David Pierce, and Alex Cranz discuss all the important announcements from Apple’s WWDC. Also: USB-C will be mandatory for...
A bank teller called Guy realizes he is a background character in an open world video game called Free City that will soon go offline.
Watched on Trakt
Brunch in the heat
Tonight, streaming live exclusively for Supeporn.com Super-Subscribers, it’s the #ClashOfTheDildos! Which of The Seven-inspired dildos will crush the competition in this tip-to-tip challenge? Will it be the reigning champion Homelander Star-Spangled Banger or Starlight’s electrified Star-Brator? Join us as we put these pleasure-pounding penetrators through their paces! Only on Supeporn.com!
Watched on Trakt
This week’s Quickfire Challenge takes inspiration from "Top Chef" France’s infamous Black Box challenge. In teams of two, the chefs each take a turn entering the box where they blindly taste a dish created by guest judge Gabriel Rucker and then must try to recreate it. During a night off, the chefs are surprised by guest judges Kristen Kish and Brooke Williamson arrive with care packages from their families. However, in true “Top Chef” fashion, there’s a twist and they must use the ingredients from their care packages to make their dish for the Elimination Challenge.
Watched on Trakt
Armed with weapons that are less than intimidating, Space Force soldiers — led by General Naird — play war games with their Air Force rivals.
Watched on Trakt
Flying high after his war games win, General Naird comes crashing back to reality when he learns there may be a spy in Space Force.
Watched on Trakt
General Naird volunteers for Dr. Mallory's Lunar Habitat Experiment. Meanwhile, Erin tries to throw a party, and Space Force gets a snazzy new look.
Watched on Trakt
A working mom yearns to balance her home life and career as a pediatrician, but her look screams "medical student." Time for some style tips stat.
Watched on Trakt
Devoted lifeguard Mitch Buchannon butts heads with a brash new recruit. Together, they uncover a local criminal plot that threatens the future of the Bay.
Watched on Trakt
Thank God for 24 hour diners! I’m starving.
“The Simpsons” quote draft By The Incomparable
This weeks episode really takes a step back from the main story line and focuses on a character we’ve seen a lot in the background, but never...
Net neutrality is dead, Palmer Lucky wants to secure the border, and a Fitbit for kids is now for sale. By Subnet
Microsoft is scooping up game studios, Apple may ditch the physical buttons on the Apple Watch, and Airbnb is helping people host others during...
Made it to #mtpcon! #mtpcon
Quick coffee...
Indie developer Casey Liss of Accidental Tech Podcast fame recounted his experience using Claude Code on his app, Callsheet. With Claude Code, he was able to fix two bugs that had eluded him for months, and his take on the experience is unique.
I expect Casey to receive some negative feedback about this, but I totally understand the perspective. It’s okay to perceive a coding agent as an extension of your team. For indie developers, who are often a team of one, having an agent to bounce ideas off of, to experiment with, and to debug/fix code with is incredibly impactful.