My friends and I take turns picking movies to watch. I converted our crappy spreadsheet into a whole ass website.
Since the COVID-19 pandemic, I have been watching things over Discord on a nearly nightly basis with my friends Felicia and Beth. Sometime in March of 2025, we welcomed our friend Casey as a fourth to our nightly “watchies” group.
Casey and I have similar tastes in movies, but Beth, Felicia, and myself have wildly varied taste in movies at times, so we started a rotation sometime in 2023 to make it easier to pick what we were going to watch on any given night. We call this “Watchies.”
I made a spreadsheet on Google Sheets that I didn’t give much thought to. It was pretty simple. A few columns of names, what we watched, and sometimes I’d do bits like giving “Getting There” an entire row, making the text large, and coloring it brown because it was so bad that we stopped watching it. The “BIRTHDAY/GUEST” column was an afterthought. Also, this used to be on a black background before I deleted the spreadsheet by accident and restored it, hence the godawful yellow on gray.
It’s just ugly and bad and wrong.

Sometime during the early days of watchies, I created a Letterboxd account as well, and started religiously logging everything that I watched. Every time watchies ended for the night, I would log whatever we watched it in the spreadsheet and then log it to Letterboxd. The longer all of this went on, I found myself kind of regretting the lack of effort I put into the spreadsheet.
I tend to go over-the-top on anything that I make and that shitty spreadsheet was like a stain on my reputation; my internal reputation, of course, because nobody else cared, nor should they have. This is literally just a spreadsheet to keep track of who’s turn it is to pick and we just happened to write down what we watched, too.
A few months ago, I redesigned my site at https://jesse.id from the ground up and began adding components — over-engineered as always — such as a logo that tracks the location of the sun or moon relative to my location and also conveys the weather.

Ever since then, I have had several intrusive thoughts related to that spreadsheet every time I saw it. The intensity of the itch grew each time I had to look at it to log a movie.
“This spreadsheet really sucks. A thing that represents such an important thing to me shouldn’t suck this much.”
– 👍👍 This Guy
Well, the intrusive thoughts won and today it all changes because after lots of thinking and iterating, I have launched https://watchies.jesse.id. This new website completely replaces our watchies spreadsheet with the exact same thing but now it has way more shit in it that ultimately only I will see or care about!

The site integrates with both the The Movie Database (TMDB) API and Letterboxd RSS feed, combined with profile scraping, to provide extended information about nearly all of the things we have watched as well as any reviews that we have left on Letterboxd. Some of it isn’t perfect. That’s Letterboxd’s fault. It’s 2026 dude, where’s the public API? I digress.
On the front page, you can hover over any cell with a movie or television show and if it’s linked properly to The Movie DB, you can see its movie poster, synopsis, and the ratings that we’ve given it. You can then click on the review in the on-hover tooltip to go to the individual’s Letterboxd review directly.

Or if you want to see all of our reviews without hovering over a million cells, you can go to the “Reviews” page and see a nicely formatted list of them, with side-by-side columns to display which stuff we all reviewed.

Then we have the “Watch Lists” page that displays the Letterboxd watch lists for everyone, although currently it’s just Casey and myself. Atop that page, there is a component that calculates which films exist in multiple watch lists so we can more easily pick stuff to watch we haven’t seen but want to. Pretty sick!
That’s mostly it for the public-facing stuff. I created an administration dashboard, and profiles for each user to allow them to set their favorite color, which will change the color of their name and also the color of their notes.

The notes are on the main page , that any of us can set on any particular film by logging in to our account and clicking a little on-over note icon.

Also on the user’s profile page is their queue, where they can keep track of the next things they’re interested in watching. This is mostly for me because I have the memory of a goldfish. If we go back to the main page, we can see the queue visualized by hovering over the name in the heading it belongs to.

Users can add or remove things from this interface as well. Don’t worry about “Gagabiags.”
I SAID DON’T WORRY ABOUT GAGABIAGS.
– 👍👍 This Guy
Alright, that about does it for the tour of this new website that me and three of my friends will use, and probably no one else. Honestly, I’d be actually be surprised if my other 3 friends use it either. I’m historically very good at solving huge problems that are only huge problems to me. Most of the time, I’m the only one who sees a problem. It is one of the many blessings and curses of the AuDHD (allegedly) brain.
Oh, by the way, here is where the pixel moon is now at the time I’m publishing this article vs. when I pasted the original screenshot.

For The Nerds
If you’re into knowing how it works in the backend, here is some information.
Stack
- SvelteKit 2 (Svelte 5 runes)
- Tailwind 4
- Deployed on Cloudflare Workers with D1 (SQLite at the edge) as the only database.
- TMDB for film metadata.
- Letterboxd as a data source without any API.
How It Does Stuff
- Scrapes Letterboxd without an API or a password. Everyone’s star ratings, reviews, and watch dates come from public RSS diaries plus logged-out film pages (/{user}/film/{slug}/), matched to picks strictly by TMDB id — never by title — so a match is exact or absent. It routes around Letterboxd’s bot protection by knowing exactly which pages 403 and which don’t.
- Beats the RSS window with a history sweep. RSS only exposes ~50 recent entries per person, so a chunked sweep re-reads each person’s public film pages inside Worker request limits, accumulating ratings and reviews going back years. An every-six-hours “maintenance lap” revisits the longest-unvisited pages, so a review written today about a film watched years ago converges on its own within a couple of weeks.
- Chronology-guarded date backfill. Scraped watch dates only land on the grid when they fit the rotation’s own timeline (no earlier than the latest dated pick before it, no later than the earliest after) — so a film someone logged years before the club watched it can’t backdate the grid.
- In-place grid editing. Admins edit picks directly on the home grid — typing a title live-searches TMDB and choosing a match fills title + link in one save.
- Zero-live-call stats page. Genres, decades, and runtimes render entirely from a D1-cached copy of TMDB details; TV nights are billed by parsing episode ranges out of the pick’s own title (“Black Sails S4E9–E10” = two episodes at that show’s episode length).
- Two cron triggers do all the upkeep — a daily RSS sync + watchlist mirror, and the six-hourly maintenance lap — with an admin button and a ?dry=1 preview for manual runs.
- Disciplined ops for a four-person site: every deploy must be a clean tree at a tagged commit whose version has a CHANGELOG section (the deploy script refuses otherwise), secrets flow from 1Password through a read-once FIFO, and /sitemap (human) and /sitemap.xml (crawlers) render from one shared source so they can’t drift.