Catalog the records nobody else can read
You point your phone at a record label and tap a shutter button. WaxStax sends one frame to a vision model trained to recognize records the way an experienced shop owner does — by label design, era, typography, regional pressing tells. It hands the answer to Discogs to get the canonical release ID and live marketplace pricing, and that goes into your local collection. No barcode required. No account required. Your data lives on your device. When you want to push to Discogs, export a CSV and import it on the web — with release IDs intact so nothing duplicates.
WaxStax is an iPhone app for vinyl collectors. You frame the label of a record in the viewfinder, tap IDENTIFY, and a vision-language model figures out what it is — artist, title, label, catalog number, year, country. WaxStax then queries Discogs for the canonical release, scores the search results against the model's identification, and shows you a confirm card with cover art, full metadata, and live marketplace pricing. Tap Add to Collection and it's saved locally.
The use case WaxStax was built for is the one barcode scanners give up on: vintage pressings, regional editions, faded sleeves, white-label promos, generic dust jackets. Records where the catalog number is half rubbed off and the band's name is in a script you can't read. The app is iPhone-only, iOS 17+, SwiftUI throughout. It uses Claude Haiku 4.5 for vision, Discogs for metadata, and SwiftData for local storage. It does not have a backend. It does not have a login screen. It does not have a paywall.
An earlier prototype of WaxStax used continuous on-device OCR — Vision framework, candidate classification, regex catalog-number matching, Jaro-Winkler scoring against a label-name dictionary. It was deleted after Phase 1 testing showed it couldn't handle the records that actually matter. The text on a vintage Trojan reggae label is curved, faded, and overprinted. A 1960s Blue Note label has the catalog number in a tiny serif that OCR mistook for line noise.
A vision-language model identifies records the way a person does. It sees the typography, the color of the label, the shape of the logo, the layout of the text — all at once. It returns a structured guess with a confidence rating and a one-sentence reason. WaxStax doesn't have to be right on its own; it just has to be close enough to feed Discogs's catalog-number search and let the marketplace data do the rest.
You already keep your collection in Discogs and you want it to grow without the typing tax. WaxStax gets new pickups into your local catalog in seconds with Discogs release IDs intact, and exports a CSV that re-imports cleanly.
You're triaging a buy-out and need to know what's in the box right now. WaxStax pulls live Discogs marketplace stats — lowest, median, highest sold; how many are for sale; have/want ratio — onto the confirm card. Price each record before it leaves the table.
You're at a record fair flipping through a $2 bin and you need to know if the white-label 12" is the rare promo or the common reissue. Tap. Read the catalog number. Decide. Move on. Your saved scans build a digger's notebook on your phone.
A relative left you a box of records and you have no idea what's there. WaxStax is faster than typing fragments into Discogs and friendlier than guessing. Confirm cards explain what each record is in plain language so you can decide what to keep, sell, or donate.
The Scan tab runs an AVCaptureSession for live preview only. Frames are not streamed off the device. The most recent frame sits in a locked property on the camera session, ready to be grabbed when you pull the shutter.
When you tap IDENTIFY, the camera's latest frame is encoded as a portrait-oriented JPEG (~85% quality) and posted to Anthropic's Messages API. Back-camera frames arrive landscape-native, so the encoder applies a 90° clockwise orientation and bakes it into the JPEG before sending — otherwise Claude reads the label sideways.
The request includes an identify_record tool with strict: true, additionalProperties: false, and every property in required. Claude must return JSON shaped like { artist, title, label, catno, year, country, confidence, reasoning }. Empty string and 0 are the "unknown" sentinels — strict mode disallows truly optional fields, so we use sentinels instead.
The decoded fields drive a Discogs search: catalog-number-first, falling back to artist+title, then free-text. Each result is scored against Claude's identification (+40 for an exact catno match, +20 each for artist / title / year, +10 each for label / country). The best-scoring release becomes the canonical match.
The confirm card shows the Discogs canonical metadata — cover thumbnail, artist, title, catno, year — plus Claude's confidence level and one-sentence reasoning. You confirm and add to your collection, or reject and try again. Either way, a haptic fires.
Claude returns empty strings with confidence: "low". We still show the result so you can see what it saw — sometimes a partial match is enough to type a search yourself. If Discogs returns nothing, the card surfaces Claude's raw output with a "No Discogs match" warning. You can still record the identification, just without a canonical release ID.
Approximately $0.002–0.005 per identification at Haiku 4.5 pricing — one ~1080p image plus a short prompt and ~50 tokens of structured output. You absorb the cost via your own Anthropic API key. WaxStax does not mark up or rebill.
Confirmed records save to a local SwiftData store. The Collection tab opens to a 3-column cover-art grid; toggle to a list view with artist, title, year, and catalog number columns. Sort by date added (default), artist, title, year, purchase price, or estimated value. Filter by tag, media condition, label, or year range. Search is case-insensitive and diacritic-insensitive across every text field — artist, title, label, catalog number, notes, tags. Built to scroll smoothly past 500 records on an iPhone 13.
Each record carries the Discogs-sourced metadata at add time — artist, title, label, catalog number, year, country, format, genres, styles, cover art, marketplace pricing — and a set of user fields you fill in: media and sleeve condition (Goldmine grades), purchase price and date, source, landed cost, personal rating, freeform tags and notes, and a folder name that maps directly to your Discogs collection folders on export.
Cover art is downloaded to the app's support directory and the local path is stored in SwiftData — no Data blobs in the database. Pricing is cached for 24 hours with manual refresh.
WaxStax exports your collection in four formats through the standard iOS share sheet. The flagship format is a Discogs-import-ready CSV, with columns in their exact order:
Catalog#, Artist, Title, Label, Format, Rating, Released, release_id, CollectionFolder, Date Added, Collection Media Condition, Collection Sleeve Condition, Collection Notes
The other three formats are generic CSV (all fields), JSON (full fidelity, lossless round-trip), and XLSX (pure-Swift writer, no heavy dependencies). Bulk export of 1000 records finishes in under five seconds. Everything goes through the iOS share sheet — saveable to Files, emailable, AirDroppable.
There is no WaxStax backend. No login. No cloud sync. Your collection lives in SwiftData on your phone. The only outbound network calls are:
These domains are declared in the app's PrivacyInfo.xcprivacy manifest and the App Store privacy section. Both API keys are stored in the iOS Keychain. WaxStax has no telemetry, no analytics SDK, no advertising identifier collection, no Facebook SDK, no third-party trackers of any kind. The full text of the privacy policy is at /privacy.
Hi, I'm Craig Cowden. WaxStax is an independent project — built and maintained by me. I make tools that I want to use myself, and try to be honest about what they do and don't do. WaxStax exists because I have a stack of records that aren't on Discogs yet and I'm tired of typing.
Privacy matters. WaxStax processes your collection on your device. The app does not have a backend, does not collect telemetry, and does not sync to the cloud. Outbound calls go directly from your phone to Anthropic and Discogs using your own API keys.