Regular readers are well aware of Jenny’s influence as a film and television critic (see: Real-time on-screen product detection; The Vampire Lestat fka Interview with the Vampire Daniel Molloy on-screen detection), but few know of her expertise in chain restaurants.
In early brainstorming sessions that would later form the basis of Yelpboxd (now in limited beta), Jenny provided empirical evidence of the superiority of Impossible™ Nuggets as an AMC Theatres concession and drew branding parallels between AMC and Chili’s. Alamo Drafthouse, we agreed, might pair better with Applebee’s; Regal Cinemas with Dave & Buster’s; but we soon realized there was no industry standard for chain restaurant-movie theater pairings. These data points, combined with an ill-fated endeavor to get through a complete Benihana experience before a Pillion screening at the AMC Kabuki (we couldn’t say no to framed photographs with our tablemates! we were very late to the movie), motivated our research into a comprehensive recommendation system for the elusive “dinner and a movie” that would withstand the tests of time, traffic, and temperament.
We built Yelpboxd to formulate “dinner and a movie” as a constrained optimization problem and recommend personalized plans addressing user needs across specified film, restaurant, and planning preferences:

Problem statement
We established a toy problem of matching chain restaurants to movie theaters by branding similarity, but we realized the actual gap in the market was much larger: how would we design a recommendation engine that could suggest optimal plans tailored to a user’s restaurant and film preferences while giving them enough time to get from dinner to movie? If Yelp was the people’s restaurant review platform and Letterboxd (“the social network for cinephiles”) the same for film, Yelpboxd begged to be built for the combined restaurant-and-film industry.
Farm-to-table recommender systems
“Recommender systems” encapsulate such a wide range of technologies that it can seem fruitless to try to define them in a few sentences, but one useful categorization is algorithmic- vs. human/socially-driven recommendations. Netflix, YouTube, TikTok, and Spotify lean algorithmic: they build a model of your viewing and listening “taste profile” as you engage with and spend time on their platform and suggest content you might like based on inherent features (content-based filtering) and your activity as compared to other users’ (collaborative filtering). Letterboxd and Yelp fall somewhere closer to organically- and socially-driven. Due to higher time and cost for users to dine at restaurants and watch movies and fewer interactions tracked natively on these platforms (you don’t post reviews on Yelp or log movies on Letterboxd at the rate you might interact with music on Spotify or scroll through TikTok), pair-wise user comparison data is inherently limited.
Still, this shouldn’t be a technical limitation preventing a platform like Letterboxd, which maintains user watch logs, ratings, reviews, and film data (genre, director, cast, etc.), from training and exposing a recommendation system using both content-based and collaborative filtering techniques. This means that Letterboxd is making an active choice not to maintain an algorithmic recommendation system, preferring to limit users to leverage social ratings and browse curated lists. As I previously covered in Scaling laws for personalized recommendation models and Alignment in recommender systems, this style of more human-, less machine-driven recommendation aligns with the ethos of encouraging natural information spread and diversity over isolation and segmentation: “we view the whole of Letterboxd as one big, organic recommendation engine”.
We take a similar “farm-to-table” approach to building the Yelpboxd recommender, prioritizing organic value to our customers (“would you use this? does it help you plan dinner and movie nights that are actually successful?”) over optimizing for monetization or data collection opportunities that would “improve” the recommendation model by e.g. YouTube measuring user engagement via click through rate and watch time metrics, but not necessarily capture enjoyment and logistic success rate of Yelpboxd users.
Prototyping Yelpboxd v0.0
Seed prompt: “build a website called YELPBOXD that recommends dinner & a movie plans for the user based on their location and time of day (to see what restaurants & showtimes they could reasonably get to locally)”
We’d expect a functional UI but no integration with Letterboxd, Yelp, or any recommender model from this.
Indeed, Claude built a functional UI informed by Yelp and Letterboxd (“Yelp red + Letterboxd dark/green-orange-blue aesthetic”) without additional style guidance from me. However, because Claude knew I had a “free-first preference”, it made a decision to build a UK-based app because it could find more free cinema showtime APIs in the UK. UK localization was not desirable, because Yelpboxd’s first users were primarily based in the US.
Dangerously, Claude listed “simulated showtimes” in this version of Yelpboxd. That meant you could theoretically get dinner and then show up to a theater to a nonexistent showtime. This was an unacceptable user experience.
Find an alternative to UK movie theater chain-specific showtime APIs with reasonable coverage in the US. Claude was able to find a free Cineworld UK API endpoint to serve UK showtimes, but in the US, the only free solution it could find was SerpApi (a limited Google Search API scraper).
Google sued SerpApi last year for “circumventing security measures protecting others’ copyrighted content that appears in Google search results”, but Claude seemed to have no issue suggesting it to me as a “genuine option”. Even so, nothing is truly free in this world: SerpApi limits free plan users to 250 searches per month, which Claude claimed it could stretch via Cloudflare Worker caching. I generated a SerpApi key and deployed it as a Cloudflare Worker Secret.
SerpApi only provided showtimes as pulled from Google. (Apparently, Google used to provide If we wanted to add runtimes, Claude suggested TMDB (The Movie Database), for which I similarly generated a developer key and deployed it as a Cloudflare Worker Secret.
Yelpboxd’s free-first philosophy limits integration with Yelp and Letterboxd. Yelp limits OAuth authorization to contracted partners and its Places API to plans with only a 30-day free trial, so continued access beyond that that would not scale for a free-first Yelpboxd prototype. Letterboxd also limits its API (“not granting access for data-analysis, visualization or recommendation projects, for LLM or GPT-related use, for private or personal projects”) but Claude pointed out that Letterboxd does expose RSS feeds by username.
By asking a Yelpboxd user to optionally input their Letterboxd username, we can pull their public RSS feed including their watchlist and ratings. Claude suggested a basic personalization filter which could hide already-watched films, boost films on your watchlist, and bias recommendations to films with genres (cross-checked with TMDB) you’ve historically rated highly.
Localize distance conventions by country and transit options by city size. Claude starting with UK-based theaters and assuming driving as mode of transit revealed two optimizations required for Yelpboxd’s primary users:
localize distance conventions, e.g. imperial vs. metric,
prioritize walking and public transit in big cities (“transit-aware”).
Yelpboxd v0.0 UX walkthrough
At this point, we had a working v0.0 Yelpboxd prototype we could user test.
Landing page
Yelpboxd uses a standard search landing page reminiscent of Yelp’s, with options to import your film log from Letterboxd and options to set when you’re planning your dinner and movie, how far you’re willing to travel, and cuisine preference.
Personalized results
Using the options toggled above, we got these recommendations for tonight.
The Good:
Yelpboxd v0.0’s best match suggestion was a workable dinner and movie plan that was within the user’s time request (7pm is the default for “tonight”), cuisine preference (Mediterranean), and a legitimate showtime of a film the user had not seen (Toy Story 5).
The Bad:
The second suggestion was not going to work. Pharaohs is permanently closed. Yelpboxd was suggesting a plan worse than our motivating Benihana and AMC Kabuki Pillion combination: the dinner did not exist.
This is because Yelpboxd uses OpenStreetMap for free restaurant data, which is crowdsourced and thus prone to errors and outdated information. Yelp integration would have avoided this problem, but we do not currently have Yelp API access as explained above. Bug #1: Remove permanently closed restaurants from results.
The Ugly:
The “Plan For” dropdown mapped “Right now” to the user’s current time, “Tonight” to 7pm today, and allowed the user to select a different time today, but did not provide any way to plan for a future date. Improvement #1: Add a date picker for future plans.
We pulled restaurant logos from their websites when available because OSM restaurant images were even sparser, but this led to strange formatting e.g. SAJJ logo cropped arbitrarily. Improvement #2: Find other sources of restaurant images.
Yelpboxd exclusively recommending Toy Story 5 was suspicious. To be fair, we were testing a “nearby” case with location set to SFMOMA, so expected to be shown showtimes at the AMC Metreon. Still, AMC is a major theater and is not limited to Toy Story 5; Toy Story 5 is not in the user’s watchlist and should not be boosted up in recommendations; the user’s preferred genres as detected by Yelpboxd were “crime/thriller” which is not Toy Story 5’s classification. Improvement #3: Diversify the recommender to ensure it doesn’t fall into a Toy Story 5 trap without reasonable explanation.
Yelpboxd was randomly picking restaurants based on proximity and cuisine selection without considering reviews or similarity to the user’s dietary preferences. This was expected because we could not find a way to integrate with a user’s Yelp or dining preferences for free. But we could at least introduce a basic user input and feedback loop for dining. Improvement #4: Add an option to not show a user certain restaurants.
Improvements made in Yelpboxd v0.1
You can try Yelpboxd out for yourself for free (limited beta). We are currently limited by SerpApi’s free tier to 250 searches per month, so Yelpboxd will not return useful results after we hit that. For reference, developer testing has used ~60 of those 250 searches so far this month.
(Fixed) Bug #1: Remove permanently closed restaurants from results. We knew that permanently closed restaurants like Pharaohs could still be listed in OSM, and without access to Yelp’s more accurate and updated API, we had to find a different way to detect restaurants that no longer exist. Claude suggested OSM lifecycle checks to detect stale data and running a DNS check on restaurants' domains, which flagged Pharaohs as nonexistent. We shipped this and Pharaohs no longer appears in results.
(Fixed) Improvement #1: Add a date picker for future plans. We addressed the inability to plan for a future date seen in v0.0 by adding a calendar date and time picker in v0.1.
(Semi-fixed) Improvement #2: Find other sources of restaurant images. Claude proposed Wikidata and Wikimedia Commons geosearch near the restaurant (with name checking to prevent neighboring images from surfacing) as fallback sources to the official restaurant logo when available, which was a reasonable tradeoff to increase restaurant image coverage. We still display a default emoji when no image is not available, but overall restaurant image coverage is higher.
(Semi-fixed) Improvement #3: Diversify the recommender to ensure it doesn’t fall into a Toy Story 5 trap without reasonable explanation. Upon further investigation, the “Toy Story 5 trap” (where Yelpboxd exclusively recommended Toy Story 5 if the user requested plans close to the AMC Metreon at sufficiently late times) was actually linked to multiple recommender inefficiencies:
The Yelpboxd planner caps itself to reduce SerpApi calls. Claude initially tried to self-limit calls to SerpApi by capping searched restaurants at 22 per search radius, 3 cinemas at a time, 2 plans explored per showtime, showing a maximum of 6 plans. We raised these caps to expand the possible plans explored and displayed, but the tradeoff is higher SerpApi calls, and there is still a chance of falling into the Toy Story 5 trap if the search and time radius is not high enough.
Yelpboxd makes assumptions about users’ dining speed. One reason why Toy Story 5 kept dominating Yelpboxd recommendations was that it has the highest number of possible showtimes at the AMC Metreon and late showtime availability in general, so was most likely to satisfy the constraint that users needed to finish their dinner before heading to the theater. Indeed, longer than expected dining time at the Japantown Benihana before an AMC Kabuki showtime was the motivating problem behind Yelpboxd in the first place, and Yelpboxd was already factoring in time variation in dining style (more time for fine dining vs. fast casual), but we needed to give the user some option to adjust this. We added a Dinner Pace (Quick bite, Normal, Leisurely) to modify the default assumptions and open up additional planning options, but [Future Improvement #1] users may want to explicitly limit options to e.g. “dinners under an hour”.
(Fixed) Improvement #4: Add an option to not show a user certain restaurants. We added a “DO NOT EAT (SKIP THESE PLACES)” option to list restaurants users know they don’t want to eat at beforehand:
Clicking the x next to a restaurant removes it from results and adds it to the user session’s DO NOT EAT list, but [Future Improvement #2] does not persist because we don’t have a user login to store our knowledge of user preferences yet. (Yelp integration would also help with understanding a user’s dining preferences, but we understand that’s not a viable option right now.)
What’s next for Yelpboxd
While building out Yelpboxd v0.1 we identified additional future improvements including allowing users to set time goals for their own dining experiences (additional filters on price point and casual-to-fine-dining scale would also be useful) and persistent user preferences that would require direct Yelp and/or Letterboxd integration, or maintaining separate Yelpboxd user login.
More existential and central to the future development of the Yelpboxd platform is the behavior of the Yelpboxd recommendation model. Currently, we maintain a philosophical parallel to Letterboxd’s view of its platform as an “organic recommender”, which is to preserve and elevate the craft of restaurant-film pairing by using human-defined heuristics and user-specific feedback loops without storing or building a model based on user similarity. But Letterboxd has the benefit of being a social media platform: even if it doesn’t recommend films to users in the same way Netflix does, it surfaces the recommendations of your friends (and filmmakers, directors, cast members, public figures) on the platform as a feed of logged and rated films. Yelpboxd does not have this organic social discovery in place, and the next big leap for Yelpboxd will be building a balanced user graph with sufficient data and activity to establish its utility as a platform without falling into the “Toy Story 5 trap”: Yelpboxd will need to not just be consistent and functional, but also highly personal, exciting, and responsive enough to inspire even the most seasoned dinner-and-movie connoisseurs of our generation.








Love seeing my dreams come true, thank you for building this and LOVE the MVP!!
Needs a vibe algorithm that tells you “Toy Story” goes with a happy meal kind of place but perhaps not a cocktail bar