Releases: novaoc/rarebox
Release list
v1.4.3 — The booth release
🏪 Card Booth — your table, in their pocket
Selling at a card show, a store table, or out of a binder? The new Booth (More → Card Booth) lets you list what you're selling and share it before buyers reach your table:
- Build a booth from your shelves — pick cards and sealed products, asking prices pre-fill from tracked market values (yours to change), add a venue, date, and a note for buyers
- Share as a link or QR — and here's the trick: Rarebox has no servers, so the entire booth travels inside the link itself (URL fragment). Nothing is uploaded, hosted, or tracked — seller to buyer, device to device, nobody in between. Small booths fit a single QR any phone camera can scan; bigger ones switch to an animated multi-frame code
- Buyers browse read-only — sticker header, your note, every listing with its price, full-table total — and can Save this shop to revisit later, even offline
- Visitor-friendly — shared booths show no database prompts or download popups; first-time visitors get one small dismissible invite to try Rarebox, nothing else
- Booths and saved shops ride along in backups and device transfer
🔄 Device transfer rebuilt
- The QR transfer was capped at ~3KB ('collection too large') and had no scanner — now it's an animated multi-frame QR (300 cards ≈ 12 frames ≈ 5 seconds) with a real camera scanner and progress bar in the Receive tab
- Fixed: imports were being silently discarded since the IndexedDB migration — the app's unload-flush re-saved the old collection over every import (file restore and device sync). Send was also packing empty collections from stale storage keys
- Backups now include decks and the trade table (both were silently dropped before)
Polish
- Uniform listing mats in booths — tall booster boxes and wide tins letterbox into the same frame as card scans
- Settings About refreshed (auto-versioned, all six games' sources, offline + privacy notes)
Full Changelog: v1.4.2...v1.4.3
v1.4.2 — The offline release
Works offline, like a binder
The headline: Rarebox now works with zero signal. There was a gap between promise and reality — the app was installable, your collection lived on-device, and yet airplane mode meant a blank "can't connect" page, because the app itself was re-fetched from the network on every load. Not anymore.
- Service worker, generated at build time — the entire app shell is precached on your first visit. After that, opening the app and moving between Shelf, Decks, Search, Browse, and Trade needs no connection at all.
- Card images cache as you view them (capped, quota-friendly), so your shelf looks like your shelf offline. Tour videos and scanner indexes cache on first use.
- Live data stays live — price refreshes and new card searches are never intercepted or served stale. When you're offline, a chip tells you: "Offline — your shelf still works. Live prices & new searches need a connection."
- Deploys still land instantly — navigations are network-first; the cache is only the fallback.
Privacy: analytics removed entirely
Rarebox now collects nothing. The anonymous page-view counting added in v1.4.1 (Vercel Web Analytics) is gone — dependency uninstalled, not just disabled. No analytics, no cookies, no fingerprinting, no page-view counting. The Terms & Privacy policy, Settings, README, and docs all state it plainly. Offline mode is the proof: your collection never needs to talk to a server.
Settings also got a stale-data fix: the About section was three versions old — it now shows the real version (injected from package.json at build), all six games' data sources, and notes on offline mode and the on-device scanner.
Feature tours, fixed and relocated
- Tours now actually auto-play on first visit — the trigger was wired to nothing, so new users never saw them.
- The sets tour moved to the Browse hub (where every game starts), showing one card per TCG — Pokémon, Yu-Gi-Oh!, One Piece, and Magic — with the shelf total summed from those cards.
- The replay ⓘ now shows on desktop — it only existed in the mobile header, so closing a tour on desktop made it unreachable.
Landing & brand
- Two new feature cards: Works offline, like a binder and Point, scan, shelved (the scanner finally gets its own spotlight).
- X/Twitter launch assets (RB avatar + light/dark banners) rendered straight from Tactile design tokens, in
branding/.
Full Changelog: v1.4.1...v1.4.2
v1.4.1 — Image-matching scanner, link previews, PWA polish
The scanner release — plus link previews, PWA polish, and a pile of fixes from real-device testing.
📷 Scanner rebuilt: image matching, not text reading
- Deep-research-driven rewrite: cards are identified by perceptual-hash matching against 30,000+ reference card images (pHash + dHash, the technique used by industrial card sorters and every verified open-source scanner) — the exact printing (set, number, variant) in about a second
- On-device perspective rectification: Sobel edges → Hough lines → corner detection → homography warp, in pure canvas JS — phone photos at an angle now match clean reference scans
- Calibrated on a synthetic photo harness: matching thresholds tuned so the scanner never suggests a wrong card — uncertain scans fall back to the OCR/search-prefill path instead of guessing
- Indexes cover Pokémon (EN+JP), Riftbound, Lorcana, One Piece in ~840KB of static files; everything runs on-device, zero new hosting cost
- OCR (eng+jpn) remains as fallback for unindexed games
🔗 Link previews
- Sharing rarebox.io on Discord/Telegram/WhatsApp/X now shows a Tactile banner generated at /api/og — "Collect. Track. Trade. Win." with three showcase cards and live prices, rotating daily
- Text-only embeds get marketing copy with a price hook (Manga Luffy $3,975…)
📱 PWA & mobile
- Real home-screen icons: 180px apple-touch-icon (iOS previously screenshotted the page!), maskable-safe 192/512 Android icons — all the Tactile RB sticker
- Installed app no longer draws the top bar under the phone's clock/battery (safe-area insets)
- Page-stuck bug fixed: pull-to-refresh hijacked every upward swipe once you'd scrolled down — scrolling is free again, pull-to-refresh still works at the top
- Trade analyzer stacks vertically on foldables in landscape (Side B was off-screen)
- Purchase-date input no longer overflows the add-item modal on iOS
- "Hide loading progress" setting is actually honored — the pill never appears once set
🏠 Landing
- Rotating cross-TCG showcase (14 iconic cards: Lugia 1st Ed, Manga Luffy, Blue-Eyes, Riftbound Signatures, Traveling Chocobo, The Soul Stone…) with prices re-fetched live through Rarebox's own feeds on every view; the shelf total is computed from the cards actually shown
- Full-bleed TCG marquee, "Import your collection" CTA deep-linking to Settings
🧹 Housekeeping
- sitemap.xml/robots.txt pointed at the wrong domain since setup — fixed, plus JSON-LD structured data, canonical, clean URLs on the docs site
- Terms & Privacy rewritten for the current multi-TCG reality (all APIs listed, camera/OCR documented as fully on-device, contradictory analytics claims resolved)
- Anonymous, cookieless Vercel Web Analytics (page views only — no personal data, portfolio contents never leave the device)
- Reset Everything now wipes trade analyzer sides and decks too
- Tactile design docs live at docs.rarebox.io/design/tactile
v1.4.0 — Tactile: complete redesign, 10-second card DB, rebuilt scanner
The biggest release yet: a complete redesign, a 100× faster Pokémon database, a rebuilt card scanner, and a long list of correctness fixes across pricing, search, and imports.
🟡 Tactile — complete redesign
- New design system: cream paper, ink lines, 2px borders, hard offset shadows that compress when you press — every button physically "clicks"
- New navigation: bottom tab bar (Home · Search · Trade · Browse · More) on phones, foldables and tablets with iOS safe-area support and a raised Trade disc; slim top bar with inline nav on desktop. The sidebar is gone.
- "RB" sticker logomark across the top bar, favicon, and PWA icon
- New marketing landing page: rotating cross-TCG showcase — 14 iconic cards across all six games (Lugia 1st Edition, Manga Luffy OP05-119, Blue-Eyes White Dragon, Riftbound Signatures, Traveling Chocobo, The Soul Stone…), with prices fetched live through Rarebox's own feeds on every view; the shelf total is computed from the cards actually shown
- Design Lab: five complete brand directions (Mono, Aurora, Tactile, Atelier, Pulse) live at /designs
- Every screen verified at 280px (foldable cover), 360px, 717px (unfolded foldable), 834px (tablet) and desktop — zero horizontal overflow, 44px+ touch targets, prefers-reduced-motion support
⚡ Speed
- Pokémon card database loads in ~10 seconds (was 10–45 minutes): card data now comes from the official bulk dataset via CDN; prices stream in through a background pass with incremental saves and automatic resume if you close the tab mid-pass
- Settings → Refresh card database actually re-downloads now (it skipped any cache under 24h since the day it shipped)
🔍 Search
- Token-based multi-word matching everywhere — "ahri inquisitive" now finds "Ahri - Inquisitive"
- Cached searches with no usable prices fall through to live APIs, so results always show prices
- Trade analyzer search shows 30 results (was 15) and renders "—" instead of $0.00 for unknown prices
📷 Scanner (rebuilt)
- tesseract.js v7 with correct worker API (scans previously failed 100% of the time with DataCloneError)
- Japanese card support: jpn model reads the name band, resolved via tcgdex with fuzzy prefix search
- Targeted name/number band passes with preprocessing for foil cards
- Failed scans open the search box pre-filled with the recognized text — fix a character instead of retaking the photo
💰 Pricing correctness
- Riftbound: Signature/Alternate Art cards no longer inherit the plain printing's price; PriceCharting fetches merge three queries and filter by set; search/portfolio/cache all share the variant-aware price map
- Yu-Gi-Oh!: each printing shows its own set price instead of the card's cheapest-reprint price
- Restored the portfolio price refresh that was stubbed out in the mobile revamp — Riftbound/MTG/One Piece portfolio prices update again
🇯🇵 Japanese Pokémon
- Card images fixed (tcgdex CDN URLs were built unpadded; the API's own image field is now used)
- The JP set-name table was rebuilt against tcgdex ground truth (~20 wrong mappings — e.g. Ancient Roar pointed at a set that doesn't exist)
- Collectr import resolution overhauled: one set name can map to several tcgdex sets and each is tried until the card exists; set-name aliases; card numbers validated; EN numbers normalized with letter-prefix retries; scored matching for other TCGs. 31/32 sample rows resolve correctly (the miss is data missing upstream)
🛠 Fixes & polish
- Portfolio desktop no longer renders every item twice
- Deck builder search shows card images again
- Meta Decks filter buttons no longer look permanently pressed
- Reset Everything now wipes trade analyzer sides and decks too, and reloads clean
- Card scans in Browse Sets sit in Tactile frames; TCG brand logos properly sized
- Image error fallbacks across all card grids and panels; dead code removed
v1.3.1 — Collectr import fixes & chart snapshots
Collectr Import
- Fixed Japanese card images and prices — now resolved via tcgdex API instead of just static URLs
- Fixed Yu-Gi-Oh game detection — Collectr uses "Yu-Gi-Oh!" which wasn't matching the GAME_MAP
- Fixed Pokémon accent detection — Collectr exports "Pokémon" with é, broke
isPkmnflag - Fixed JP CDN image URLs — series must be uppercase (
SVnotsv), localId zero-padded to 3 digits
Pokemon Card Cache (preloader)
- Made 80+ page pagination resilient to individual page failures (retries 3 before giving up)
Chart Snapshots
- Dashboard price refresh now records a snapshot afterwards — fixes flat charts that only showed stale data
Full commit log
62daa5f v1.3.1
bace7d6 Record price snapshot after dashboard price refresh so chart gets daily data points
a77f9b6 Fix Pokemon preloader resilience and JP CDN image URLs (uppercase series, zero-padded localId)
19e6200 Fix Pokémon accent detection in Collectr GAME_MAP
0200897 Fix Collectr import: JP card resolution via tcgdex API, Yu-Gi-Oh game detection
v1.3.0 — Multi-TCG Decks, Card DB, Trade Analyzer, Price Alerts, and Bug Fixes
Summary
v1.3.0 is a major release adding Yu-Gi-Oh! TCG support, a card database preloader, trade analyzer, Collectr import, price alerts, meta decks for all 6 TCGs, and 20+ critical/medium bug fixes including trade persistence data loss, non-Pokemon price refresh, Lorcana/Riftbound meta deck resolution, and navigation hangs.
New Features
Yu-Gi-Oh! TCG Support
- Full set browsing with YGOPRODeck integration
- Card search with TCGPlayer market prices
- Yu-Gi-Oh! meta decks (ygoprodeck.com top decks)
- Preloader support for offline caching
Card Database (Client-Side IndexedDB)
- On first visit, select which TCGs to track
- Preloads all card data into IndexedDB in the background — zero API calls on subsequent searches
- Floating progress pill shows per-game status, ETA, and overall completion
- Interrupted preloads resume silently on refresh
- Search works immediately — uncached TCGs fall back to live APIs
- Two-phase preloader: sets first (~2s), then cards progressively per TCG
- Storage usage display showing combined IndexedDB + localStorage
Trade Analyzer
- Side-by-side trade comparison with cards added via search or camera scan
- Live price delta with winning/losing/even label
- Grading multiplier applied per card (PSA 10 = 2x, etc.)
- Persistent trade state across sessions (separate IndexedDB key)
- Camera scan integration via Tesseract.js OCR
Collectr Import
- Import CSV or Excel exports from the Collectr app
- Maps game names, variants, grading, and sealed products
- Full-screen import overlay with progress bar and phase indicators
- Resolves all 6 TCGs with images + prices automatically
Multi-TCG Meta Decks
- Auto-fetches current tournament meta from each TCG's competitive scene
- Pokémon — Limitless TCG
- Magic — mtgtop8.com
- Lorcana — inkdecks.com
- One Piece — optcg.one
- Riftbound — RiftDecks.com
- Yu-Gi-Oh! — ygoprodeck.com
- Top 10 competitive decks per TCG ranked by meta share
- Cards resolved server-side with exact set code + number matching
- Cached for 24h with version-based invalidation
Price Alerts
- Set "notify when price goes above/below $X" on any card
- Alerts fire via the browser Notification API when prices cross thresholds
- Auto-checked on every dashboard page load
- Manage active and triggered alerts from Settings
Other
- Entire set add to portfolio from any Browse Sets view
- Sealed product search with keyword filtering (boosters, ETBs, tins)
- Graded card multipliers (PSA/BGS/CGC/SGC)
- Reset Everything clears full card cache
- Storage usage in Settings via
navigator.storage.estimate() - 404 catch-all page for invalid routes
Critical Bug Fixes
Trade Store Persistence Conflict
Trade store and portfolio store both wrote to the same IDB key (app_state) with independent debounced saves — one could overwrite the other's unsaved changes. Fixed by adding loadTradeState()/saveTradeState() with a dedicated trade_state key.
Price Alerts Never Auto-Checked
checkAlerts() and notifyTriggered() existed but were never called anywhere. Now invoked after every dashboard price refresh.
Dashboard Non-Pokemon Price Refresh Broken
Dashboard refresh loop used Pokemon-only APIs for all cards. Non-Pokemon cards (MTG, Lorcana, One Piece, Riftbound, Yu-Gi-Oh) failed silently. Fixed by splitting into Pokemon (pokemontcg.io/tcgdex) and non-Pokemon (PriceCharting) refresh paths.
resolveImportedItems Silently Fails for 4 TCGs
After Collectr import, card resolution only worked for Pokemon EN/JP and MTG. Other TCGs were skipped with a comment. Fixed by adding multiSearch resolution for all games.
Medium Bug Fixes
Navigation Hangs
Route transition with mode='out-in' could hang indefinitely when transitionend was delayed (e.g., during IndexedDB writes). Fixed by adding :duration=500 timeout.
Navigation Blank Screen
Vue Router reused component instances across route transitions, causing stale state. Fixed by adding :key on route transitions to force fresh component instances.
Lorcana Meta Deck Cards Not Loading (x2)
- Wrong set field paths: Lorcast API returns set info under a nested
setobject (c.set.name,c.set.code) but code read non-existent top-levelc.set_name/c.set_code. - Missing version-aware matching:
searchLorcanaBySetcompared fallback names like "Elsa — Snow Queen" againstc.name("Elsa") without appending the API'sversionfield. - Incorrect fallback data: All 10 Lorcana meta deck fallback entries had wrong set codes and collector numbers. Corrected against live API data.
Riftbound Meta Deck Cards Not Loading
Empty setCode caused startsWith('') to match all sets, returning wrong cards. Fixed by guarding against empty setCode. Fallback decks replaced with real card names using correct API set codes (OGN, SFD).
Riftbound Card Import Timeout
Parallelized getRiftboundCards and skipped PriceCharting on bulk load to avoid timeouts.
Sealed Search Yielding Card Results
PriceCharting results included single cards. Added isSealed() keyword filter and single-card pattern detection (set codes, collector ratios).
beforeunload Handler Multiplication
Every init() call registered a new beforeunload listener. Fixed with a beforeunloadRegistered flag.
Lorcana Preloader Price Path Mismatch
Used c.tcgplayer.prices.holofoil.market but Lorcast returns c.prices.usd. Added fallback to c.prices?.usd.
One Piece API Response Shape Inconsistency
getOptCards() only checked Array.isArray(d) but API may return {data: [...]} or {cards: [...]}. Added fallback checks.
isCacheFresh First-Card-Only Check
Only checked cachedAt of the first card. Partial caches from interrupted preloads reported as fresh. Added card count check.
Router Missing 404 Catch-All, MockDashboard Route
Invalid URLs rendered blank page. Added /:pathMatch(.*)* catch-all with NotFoundView. Removed /mockup production route.
MTG Paginated Search Replaced with Bulk Data
~545 sequential Scryfall requests (45 min) reduced to 2 requests (~5s) using oracle_cards bulk data.
Sealed Search Filtering Out Prismatic Evolutions
isSealed() didn't check consoleName for keywords. Fixed by checking both productName AND consoleName.
Collectr Import Fixes
- Rewrote to import directly into Pinia store instead of localStorage+reload
- Added BOM stripping for CSV
- Added Excel (.xlsx) support
- Fixed portfolio name mapping (Portfolio Name column, not Category)
- Fixed market price mapping (date-stamped columns)
- Fixed reactivity (black screen after import)
Code Quality & Optimizations
- Hoisted dynamic import:
import('../services/tcg/multiSearch.js')moved outside the loop inresolveImportedItemsper PR review - Empty catch blocks: Replaced with
console.warnin critical price paths - Added SEO meta descriptions to every route
- Navigation logging: Added
router.beforeEachandrouter.afterEachfor diagnostics - Global error handlers:
config.errorHandlerandonErrorCapturedfor silent failure detection - Debounced chart rebuilds (300ms), 404s cached as misses
- API calls batched — max 3-5 concurrent requests
- Retry with backoff on transient errors (429, 5xx, timeout)
- Abort-on-unmount for in-flight API calls
- Decoupled preloader from search — only activate cache after all games finish
v1.2.0 — Riftbound TCG + Multi-TCG Sealed/Graded
What's New
Riftbound (League of Legends TCG)
- 7 sets, 1000+ cards via riftcodex.com (open API, no key needed)
- Card images from Riot Games CDN
- Client-side search across all sets
- Browse: set grid → card grid with images → +Add to portfolio
Multi-TCG Sealed & Graded
- Sealed products (booster boxes, ETBs, tins) now available for all TCGs: Pokémon, Magic, Lorcana, One Piece, Riftbound
- Graded slabs (PSA / BGS / CGC / ACE) available for all TCGs except Riftbound
- Type filtering fix: all TCGs get card/graded/sealed tabs
Fixes
- Replaced broken Riftbound JSON provider with riftcodex.com API
- Fixed 'Failed to load sets' error for Riftbound
- Updated docs and README for multi-TCG support
v1.1.0 — Multi-TCG Browse & Search
What's New
Multi-TCG Browse
- Browse Sets is now a hub for multiple trading card games
- Magic: The Gathering — every English set via Scryfall, USD prices, set symbol icons
- Disney Lorcana — all sets via Lorcast, USD prices
- One Piece Card Game — 20 English sets, 3300+ cards via optcgapi, USD market prices
- Pokémon keeps its full dedicated experience (unchanged)
- Branded landing page tiles with inline SVG logos
Multi-TCG Search
- Search box now queries all four TCGs in parallel
- TCG filter pills (All / Pokémon / Magic / Lorcana / One Piece)
- Color-coded game badges on each result
- Results sorted by name relevance across all games
Graded Cards for All TCGs
- Add graded slabs (PSA / BGS / CGC) for Magic, Lorcana, and One Piece cards
- Sealed products remain Pokémon-only (PriceCharting)
Performance & Polish
- In-memory API caching (1h sets, 10min cards) — no re-fetching on repeated visits
- Abort-on-unmount — navigating away cancels in-flight API calls
- Route ordering fix — Pokémon Sets page no longer shadowed by wildcard
Data Sources
- optcgapi.com (One Piece — sets, cards, market prices)
- Scryfall (Magic — sets, cards, USD prices)
- Lorcast (Lorcana — sets, cards, USD prices)
v1.0.1 — Critical IDB Fix
Critical fix: cards and items were failing to save after the IndexedDB migration.
Vue reactive proxies cannot be serialized by IDB's structured clone algorithm. Every save was throwing silently, corrupting app state and causing 'portfolio not found' on refresh.
Fix: deep-clone state before writing to IDB. Wrapped persist in try/catch so a failed write never breaks the app.
v1.0.0 — First Release
Rarebox v1.0.0
Pokemon TCG portfolio tracker — cards, sealed products, graded slabs, live prices, and value charts.
Features
- Collection Management — Cards, sealed products, graded slabs (PSA/BGS/CGC/ACE)
- Portfolio Charts — LOCF value-over-time charts with 7D/1M/6M/1Y/3Y ranges
- Deck Builder — Build decks, track ownership against collection, cost to complete
- Live Meta Decks — Auto-fetched from Limitless TCG, one-click import
- Browse Sets — English + Japanese sets, paginated card grid, bulk add entire set
- Live Pricing — pokemontcg.io (cards), PriceCharting (sealed/graded), cardmarket (JP)
- Price History — TCGPlayer data back to Nov 2022 via tcgdex
- Price Alerts — Browser notifications on threshold crossing
- Bulk Import — PTCGL/PTCGO deck list paste
- Backup & Transfer — JSON export/import, QR code transfer between devices
- Excel Export — Collection data to spreadsheet
- PWA — Installable on Android, iOS, desktop
- Feature Tour Videos — In-app tutorial videos for Browse Sets and Decks
- SEO — History mode routing, OG tags, sitemap
Infrastructure
- IndexedDB persistence — Dexie.js replaces localStorage as primary storage (auto-migrates existing users)
- Per-type price staleness — 24h for cards, 12h for sealed/graded
- API resilience — Retry with exponential backoff, batched concurrent requests
- Zero-cost architecture — Client-side storage, browser-direct PriceCharting API, Vercel serverless
Stack
Vue 3 + Vite + Pinia + ApexCharts · pokemontcg.io · PriceCharting · tcgdex · Limitless TCG · Vercel