I cut the cord years ago. Between the streaming services, the Blu-ray shelf had quietly turned into furniture, then into storage bins. I wasn’t watching any of it. I wasn’t even seeing it anymore. So this summer I decided to get rid of the discs.
The first worry was the obvious one: what about the stuff I actually care about, or a movie I’d want on a long flight with no signal? That part sorted itself out fast. A short list of titles were keepers, and the keepers stayed. Everything else went in the sell pile. Well-trodden ground, and not what this post is about.
The hard part was the discs themselves, hundreds of them. Selling Blu-rays one at a time on eBay is a part-time job: photograph it, look up its worth, decide if it’s even worth listing alone, write a title, write a description. Against a stack that size, the rational move is to dump everything into lots. But some of those discs are quietly worth real money, and I didn’t want to give those away by accident.

So I did what I always do. I built a small tool for the boring, error-prone parts and kept the judgment calls for myself. It scans every barcode, identifies each disc, flags the handful worth selling alone, bundles the rest into themed lots, prices all of it, and hands me copy-paste-ready eBay listings. Claude Code did the actual coding, but the shape of it is mine.
A $22 Barcode Scanner Changes The Whole Feel
The best decision was a cheap USB barcode scanner: this handheld one. No app, no pairing, no SDK. To the computer it’s just a keyboard that types very fast: point it at the UPC on the back of the case, it beeps, and the digits land wherever your cursor is.
That’s the whole hardware story, and it turns cataloging into something oddly satisfying. Pick up a disc, beep, drop it in the done pile, next. The scan tab is built around that rhythm. The input box flashes green for a clean match, amber for a disc I’ve already scanned, red for a failed lookup, and re-arms itself the moment the current disc is sorted. You get into a groove and a stack disappears in minutes.
Behind the beep, each barcode goes to a UPC database for a title, studio, and cover art. I’m on the free tier of upcitemdb, which is generous but rate-limited, so the tool paces its own requests and caches every result, making a rescan instant and free. The few discs it can’t identify drop into a “Fix” tab, where I type titles in one quick pass instead of breaking the scanning flow each time.
The Pricing Lesson
My first version was naive about money. The UPC database returns a lowest and a highest recorded price, so I summed the highs to value the collection. The total was absurd. One disc came back with a high near $19,000 against a low of $122. It is not a $19,000 disc. Nobody ever paid that; someone just listed it at a delusional price once and the number stuck.
That’s the whole trap with resale: anyone can ask any price. A $1 disc listed at $999 tells you only that a human can type. So the tool throws the high away and values every disc off the floor, the cheapest copy actually listed right now. If a disc’s high is more than ten times its low, it’s flagged suspect, struck through, and left out of the totals.
Getting a real floor means asking a real marketplace, so the tool calls eBay’s Browse API for each disc: it pulls the live listings for that barcode and takes the cheapest as the floor. The same call answers how many copies are for sale right now. The UPC database’s price is only a fallback for discs eBay has never heard of.
One honest limit: even the eBay floor is an asking price, not a sold one. Real sold history lives behind eBay’s approval-gated Marketplace Insights API, which I skipped for a project this size. So the numbers mean “what it’d cost to buy this today.” That’s close enough for good sell-or-bundle calls.
Which Discs Are Worth Their Own Listing
The core decision is: own listing, or into a lot? Selling alone only pays off if a disc clears two bars at once.
The first is price. After eBay’s cut and Media Mail postage, a disc has to floor around $15 before a solo listing nets more than a couple of dollars. Below that, the effort eats the margin.

The second I missed at first: supply. A disc can be worth $30 and still be a bad solo listing if two hundred other people are selling it. So the tool also asks eBay how many copies are live, and a disc only earns its own listing if just a few are. Price is what everyone checks; scarcity is the half asking prices can’t fake, and it’s what actually makes a listing move.
Clear both bars and the disc gets pulled out. Everything else goes in a lot, which is most of the collection.
Letting Claude Build The Bundles
Bundling is where the collection stops being a spreadsheet and becomes a judgment call, so I handed it to Claude. Forty random discs sell for scrap. Forty horror discs, or forty kids’ movies, or a stack of Criterion titles, sell to someone who wants exactly that.

The tool gives Claude the leftover discs and asks for two things: pull out anything genuinely collectible (out-of-print Criterions, Disney vault titles, anime, steelbooks, boxed sets), then group the rest into themed lots of twenty-five to fifty, inventing themes that fit what’s actually on the shelf. I told it not to pad a lot just to hit a size, and to report the leftovers rather than cram them somewhere.
Claude only ever proposes. Every grouping lands in front of me and I drag things around before anything’s final. It’s a “Claude drafts, you decide” tool, like everything I build. The model is tireless at sorting; I’m the one who knows not to break up the Kevin Smith run.
Pricing A Lot Against Other Lots
Pricing a bundle has its own trap. The tempting move is to add up the individual disc values, but nobody pays per-disc value for a bulk lot.
The tool prices lots against other people’s lots. It searches eBay for comparable bulk listings (“horror blu-ray lot,” “blu-ray lot of 30”), reads the disc count out of each title, throws out the junk (the “you pick 5” pickers, the DVD-only ones), and works out a realistic per-disc rate from the real market. It applies that to my lot’s size and shows me the closest comps to sanity-check. If there aren’t enough real comps to be honest, it declines to guess.
The Last Mile Is Copy And Paste, On Purpose
I stopped short of posting to eBay automatically, on purpose. Reading prices off eBay is one thing; auto-posting live listings for money is a risk I didn’t want in a weekend project. So the last step generates everything a listing needs and hands it over to paste in.

For each lot it builds an eBay-legal title under 80 characters, an alphabetized list of every disc, and the item specifics the form wants. Anything that’s a factual claim only I can make, like disc condition, returns, or shipping region, stays an explicit [FILL IN] rather than a claim about goods it’s never seen. The listing screen breaks it all into separate copy boxes with their own buttons, because eBay’s form has separate fields.
My favorite touch is the least glamorous: it prints a checklist, a clean two-column, checkbox-per-disc sheet for each lot, so I can walk to the bins and pull the right forty discs into the right box without squinting at a screen.

What It Actually Is Under The Hood
For anyone who cares about the build, it’s deliberately small. It runs as a single Node process with a hand-written web server and a plain HTML and JavaScript front end, no build step, and just one third-party code library, the Anthropic SDK. It does lean on three outside services to do its job: upcitemdb for barcode lookups, eBay for pricing, and Claude for the grouping. The whole database is a single JSON file, written to a temp file and renamed so a crash mid-save can’t corrupt it. It runs on my machine for an audience of one.
That smallness is the point. This didn’t need to be an app, a service, or a startup. It needed to turn a demoralizing pile into an afternoon of beeping a scanner and dragging boxes around.