Repository navigation
v1.7.0
Net worth over the API, per-copy card values, and drag-to-file binders. Closes #31 and #33.
Read-only API access (#33)
Nothing outside Bindarr could read what a collection is worth. A login session expires overnight, so a tracker polling it gets logged out, and /api/stats is a dashboard payload that runs two top-N queries and a per-set progress walk to produce a number the caller already knew it wanted.
- Per-user API key, generated in Settings. It never expires, and what makes that acceptable is that it is read-only:
authenticateTokenrefuses any non-GET on it,requireAdminrefuses it outright, and/auth/mestrips the account's other provider keys so a key pasted into a dashboard config cannot leak the PSA or TCG one. GET /api/stats/networth— one pass over the collection: value, spent, gain,byGame, andcurrenciesas a list, because providers quote in USD and EUR and the total sums them as-is. Claiming"USD"would be a lie.
curl -H "Authorization: Bearer <key>" http://localhost:3001/api/stats/networthPer-copy card values
That figure is only as good as what a graded copy is worth, and every price source here — TCGplayer, Scryfall, Cardmarket — quotes the raw card. A PSA 10 is not the raw price plus a bit.
collection.market_value, typed by the owner or fetched, withresolveCardPricepreferring it over every provider column. One column, so net worth, set totals, price sort and exports all read the same number regardless of origin.- An optional PokemonPriceTracker key fills it for Pokémon slabs from
ebay.salesByGrade— PSA, BGS and CGC, half grades included. When a grade has no sales the refusal names the grades that do. - It is a button and never a sweep: that provider bills per card returned and the free tier is 100 credits a day.
Binder drag-and-drop (#31)
Drag a card from Unsorted into a pocket, drag a filed card to another pocket (empty = move, occupied = swap, across the spread included), or drag one back to the queue to unfile it. No backend change was needed — /collection/:id/place already swapped and moved. Custom-order binders, mouse only; touch keeps filing by tap under Arrange, since a touch drag would swallow the page-swipe.
Also in this release
PSA cert lookup and slab grading, TCGCSV pricing, card art overrides, and the global scan-index rebuild: code-free recall now uses BoVW instead of CLIP. The README was rewritten around Docker with the non-setup material moved to PROJECT.md, and Settings keeps every provider key in one panel instead of four.
Fixed
/api/exportanswered 500 on every current database. It selectedc.sub_location_1, a columndb.jsdrops the table to remove, and its market price wascc.price_trendflat — wrong for every foil, 1st Edition and slab. Rebuilt from the compartment, priced throughresolveCardPrice.- The card inspector showed the price resolved for the saved printing, so switching foil type changed nothing until a save and a refetch. It resolves live now. Condition still cannot move a price because no source prices one, and a played copy says so rather than showing a NM figure with no explanation.
Upgrading
docker compose pull && docker compose up -d, or download a server archive below. No manual migration steps.
Full changelog: v1.6.1...v1.7.0