Work

Independent product, 2026

Built for the other side of the card table.

A collector and vendor workspace with AI card identification, pricing, inventory and a customer-facing QR storefront.

Role
Product design and full-stack implementation across the collector, vendor and event workflows.
Stack
Next.js, TypeScript, OpenAI vision, Supabase, PostgreSQL, Stripe
Status
Hosted application
listed.cards

Sign-in and camera features work best in the full app.

Context

At a card show, a seller needs to find a card, check a price and complete a sale while talking to a buyer. listed.cards connects that fast in-person workflow to collection management, pricing data and a public digital table.

What I did

  • Built collection discovery, card detail views and a Show Table Mode with quick repricing, sale recording and undo.
  • Implemented an AI scanning pipeline that extracts card identity, matches catalogue records, enriches prices and supports manual correction.
  • Built a modular pricing pipeline, subscription-based feature access, public QR storefronts and card-show event workflows.

Engineering decisions

The buyer sees a different data contract.

Public storefront responses allow only buyer-facing fields. Seller floor prices, acquisition costs, profit and private notes are excluded at the data layer.

Pricing is a pipeline.

Adapters normalize results from manual overrides and external sources. Plan permissions filter available adapters, while confidence and currency remain part of the result.

A scanner needs an escape hatch.

Vision can miss a set number or confuse similar artwork. Structured extraction, catalogue matching and manual overrides keep identification recoverable.

Scope

External pricing and payment services have their own availability and account requirements. The portfolio review did not transact a sale or charge a payment.

Reviewed the pricing engine and vision route, and explored the signed-in catalogue, vendor table and public storefront. Screens show actual application views.

Next projectBashlings