Skip to content

v1.7.0

Choose a tag to compare

@github-actions github-actions released this 17 Aug 19:38
· 393 commits to main since this release

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: authenticateToken refuses any non-GET on it, requireAdmin refuses it outright, and /auth/me strips 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, and currencies as 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/networth

Per-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, with resolveCardPrice preferring 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/export answered 500 on every current database. It selected c.sub_location_1, a column db.js drops the table to remove, and its market price was cc.price_trend flat — wrong for every foil, 1st Edition and slab. Rebuilt from the compartment, priced through resolveCardPrice.
  • 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