Emmanuel Whyte
3D storefront

Binder Bangers

Year2026
Kind3D storefront
Built withThree.js, Python, PostgreSQL
StatusIn progress
Self-hostedPokémon TCGTrading card showcase

A Pokémon card collection you can walk through in 3D, and a small storefront built into it.

Binder Bangers started where Wet Dry Digital left off. That project hung my artwork on walls in a 3D gallery you drift through. This one lays my Pokémon card collection out on a long felt table: every binder page becomes a framed case, and every card can be picked up, turned over, and read like a wall label. The difference is what happens next. A visitor can see what is for sale or for trade, what it costs, and send a question, an offer, or a request for close-ups straight to my inbox.

It is a working tool as much as a showcase. Behind the table sit a collection ledger, a desktop binder planner called the Catalogue, and a phone app. One switch moves between the Catalogue, where binders are built, and the Showcase, where they are shown.

Owner and customer

One card, two views

The owner and the customer look at the same card. The owner sees what it cost, what it is worth, and the controls to put it on sale or on trade. The customer sees the card, its condition, and either a price or a plain "Not for sale". A switch in the menu shows the owner exactly what customers see.

Owner view: status buttons, Sell now and Trade now, owner pricing with amounts blurred
OwnerStatus, pricing, and notes. Amounts blurred here.
Customer view of the same card: $3.56, For sale, Near Mint, Ask to buy
Customer, for saleA price and an Ask to buy button.
Customer view of a display-only card: Not for sale, Ask about this card
Customer, display only"Not for sale", with room for a question.
The 3D table

Walking the binder

Built with Three.js. Drag to look around, pinch to zoom, or slide the Overview handle and the camera follows your finger along the cases. The play button runs a slow tour. Tap a card to fly to it; tap again to open it. The owner dresses the room: felt, frame and wall colours, a plain table, a low-poly room or a studio, and an optional glass lid.

The 3D table on a phone held sideways: two cases side by side
Phone, landscapeTurning the phone keeps your place; the controls fold into one row.
Grid view: two columns of large cards
GridBig cards, two across.
Binder view: a nine-pocket page, Page 1 of 99
Binder pagesNine pockets, as in the binder.
The 3D table in portrait: one framed case of cards
3D tableOne case at a time in portrait.
The Catalogue

Where the binders are built

In the Catalogue, the desktop side, each binder opens as two facing pages of nine pockets, the way it sits on a shelf. Cards are dragged into place, planned slots mark the ones still wanted, and every card carries its own label (shown here as ID-0001 and so on) that ties it to the ledger. The Match center links cards to catalog pictures. The phone app and the 3D table read these same binders, so cards appear in the order they were arranged here.

The Catalogue: pages 2 and 3 of a binder, each a 3 by 3 grid of cards with ID labels
The Catalogue, pages 2 and 3Totals are hidden and card labels replaced in this picture.
Storefront

Ask about a card

Any card on show has an Ask button: Ask to buy, Offer a trade, Close-ups, or a question. The visitor leaves a name and an email or phone number, and the message lands in the owner's Inbox with an unread badge. No payment happens on the page; the sale is arranged in person or by message. Messages are private to the owner and tied to the card as published, so the price in the message is the price that was shown.

Ask about this card form with Buy selected
The visitorA choice of buy, trade, close-ups, or question.
Inbox with a Wants to buy and a Wants to trade message
The ownerThe Inbox, with reply by email or phone. Sample messages.
Real photos

The card itself, not just the catalog picture

Catalog art shows what a card should look like. Buyers want to see the actual copy. The owner can add photos and videos to any card and straighten a scan of the front and back so it sits flat and square. Videos play with a scrub bar under the picture, so a buyer can turn the card in the light frame by frame with nothing in the way. Close-ups can go up before anyone asks, or on request.

Owner view of Magby: scans, two videos, and photo tools
OwnerAdd photos or videos, scan the front and back.
The front scan of Magby, straightened and shown whole
A straightened scanFlat and square, corners to corners.
A video of Magby paused at 0:05 of 0:12, scrub bar below
VideoScrub with the bar below; nothing covers the card.
Customer view of Magby: $89.20, Heavily Played, photos and videos
CustomerThe real copy, its condition, and its price.
Ask form for Magby with Close-ups selected
On requestClose-ups asked for in one tap. Sample message.
First visit

From a QR code to the table

At a card show, a QR code opens the public showcase on anyone's phone. The first time, a short guide lights up the controls one at a time with a blinking arrow: how to switch views and filter by For sale, For trade, or Display only; how to open a card and ask about it; and where to search.

Share window: Binder Bangers logo and a QR code
ShareA QR code for the public showcase.
Guide step 1 of 3: an arrow points at the view button
Guide, step 1The view button and filters.
Guide step 2 of 3: a card is highlighted
Guide, step 2Open a card, then ask about it.
Import

Bringing a collection in

An export from Collectr, TCGplayer, tcgpages, or any spreadsheet with card names becomes binder pages in four steps. Nothing is written until the last one.

Import cards: choose a CSV file
1. Choose the fileKeep the file's order, or sort by set and number.
The file read as Collectr: 15 cards, 15 you own, 2 pages
2. Check the matchesOwned, matched, or needing a choice.
Send the cards to one of my binders: Main Binder
3. Choose where they goA new binder, or the next free page of one you have.
Done: 2 pages, 15 of your cards placed, Open the binder
4. DoneOpen it in the Catalogue, or put it on show.
The imported binder open in the Catalogue: nine cards with ID labels
The result in the CatalogueA test import of 15 rows from a real Collectr export.
Owner tools

Setting the room

The owner chooses which binders go on show and which are display only, and styles the table with presets (Classic, Card room, Velvet, Gallery) or by hand.

Showcase settings: binders on show and the 3D table look
SettingsBinders on show and the table's look.

Tech stack

  • Three.js - the 3D table, camera rail, and tour
  • JavaScript, HTML, CSS - the phone app, installable from the browser, working offline
  • Python and FastAPI - the Showcase server and the owner tools
  • PostgreSQL - the collection ledger: every purchase, sale, and trade
  • Cloudflare - hosting for the public showcase
  • Pillow and ffmpeg - pictures cleaned of photo metadata; video still frames

More than 400 automated tests, including real browser runs on a phone-sized screen.

Progress log. Dated notes on what changed, published from the project's history. The code stays private.

View the log