{{ toastMessage }}
OP

OPBinder.com

{{ (currentUser.display_name || currentUser.username || currentUser.email || 'U')[0] }}
{{ currentUser.display_name || currentUser.username || currentUser.email }}
Found {{ totalCards }} cards
Rotation:
Show:
Set:
Color:
Type:
Box:
Sort:

Loading cards from inventory database...

No cards match your current filters

{{ card.block_number }}
{{ card.variants.length }} Arts
{{ card.rarity === 'P' ? 'Promo' : (card.rarity || 'C') }}
{{ card.card_set_id || card.card_id }}

{{ card.card_name }}

{{ card.card_type }} ${{ card.market_price.toFixed(2) }} Cost {{ card.card_cost }}
Total Owned: {{ card.owned_count }}
{{ card.in_storage }} ({{ card.storage_location === 'P' ? 'Promo' : card.storage_location }}) {{ card.rented_out || card.in_decks }} in Decks 0 in Decks
{{ card.owned_count }}
In: {{ card.decks_allocated.map(d => d.deck_name + ' (' + d.quantity + ')').join(', ') }}
Not in decks
Page {{ currentPage }} of {{ totalPages }} ({{ totalCards }} cards)

Saved Decks Gallery {{ savedDecks.length }} Saved

Browse your decks or create a new one. Mark decks as Built or Not Built to track cards.

No Saved Decks Yet

Build a custom deck from your inventory or paste a decklist from OPTCG Sim!

No Leader

{{ d.name || 'Untitled Deck' }}

{{ d.leader_name || (d.leader && d.leader.card_name) || (d.leader_id ? d.leader_id : 'No Leader') }} ({{ d.leader_color || (d.leader && d.leader.card_color) }})

⚠️ Shares cards with {{ getCompetingDeckNames(d) }}

{{ d.total_cards }}/51 cards ⚠️ No Leader ✓ 100% Owned
{{ currentDeck.name || 'Untitled Deck' }}
Total Cards: {{ totalDeckCardCount }} / 51 (1 Leader + 50 Main) {{ currentDeck.leader.card_name }} ({{ currentDeck.leader.card_color }}) No Leader Selected Leader Missing (Deck Incomplete) Need {{ deckStats.total_missing }} more {{ deckStats.total_missing === 1 ? 'copy' : 'copies' }} 100% Owned! Ready to play! {{ totalDeckCardCount }}/51 Cards Deck Value: ${{ deckMarketValue.toFixed(2) }}
⚠️ Physical Card Conflict ({{ currentDeckConflicts.length }} card{{ currentDeckConflicts.length > 1 ? 's' : '' }} already in other Built decks)

You only own enough copies to have one deck physically assembled. Swap cards when playing or make this deck primary.

{{ copyNotification }}

Deck Cards (Leader + Main Deck)

Ready Partial In Other Deck Missing
{{ currentDeck.leader.block_number || '1' }}
LEADER
⚠️ IN OTHER DECK Owned: {{ currentDeck.leader.owned_count }} 0 Owned (Missing)

{{ currentDeck.leader.card_name || currentDeck.leader.card_id || 'Deck Leader' }}

{{ currentDeck.leader.card_set_id || currentDeck.leader.set_id || currentDeck.leader.card_id }} ${{ currentDeck.leader.market_price.toFixed(2) }} {{ currentDeck.leader.card_color }}
In {{ currentDeck.leader.competing_decks[0].deck_name }}
+ Select Leader Click to choose your Deck Leader
{{ card.block_number }}
{{ card.card_cost !== null ? 'Cost ' + card.card_cost : card.card_type }}
⚠️ IN OTHER DECK ({{ card.other_built_qty }}) {{ card.needed }} / {{ card.owned_count }} {{ card.available_in_storage }}/{{ card.needed }} (Need {{ card.missing_copies }}) 0 in storage (Own {{ card.owned_count }}) 0 / {{ card.needed }} (Missing)

{{ card.card_name }}

{{ card.card_set_id || card.card_id }} ${{ card.market_price.toFixed(2) }} {{ card.card_type }}
In {{ card.competing_decks[0].deck_name }} ({{ card.competing_decks[0].quantity }})
You own {{ card.owned_count }} • Avail: {{ card.available_in_storage }}
Needed:
{{ card.needed }}

This deck is currently empty

Click "Add / Browse Cards" to select cards from your inventory or paste a decklist from clipboard.

Missing Copies
{{ deckStats.total_missing }} Needed
{{ currentDeck.leader.card_name }} {{ currentDeck.leader.card_id || currentDeck.leader.set_id }} • Leader ({{ (currentDeck.leader.owned_count || 0) === 0 ? 'Not Owned' : 'In Another Built Deck' }})
Need 1
⚠️
No Leader Selected Deck requires 1 Leader Card to be complete
Need Leader
{{ c.card_name }} {{ c.card_id || c.card_set_id }} • Own {{ c.owned_count || 0 }}/{{ c.needed }}
Need {{ c.missing_copies }}

Complete Deck!

All 51 cards (Leader + 50 Main) in this decklist are in your collection.

Deck In Progress ({{ totalDeckCardCount }}/51)

You own all selected cards so far. Add cards until you reach 1 Leader and 50 Main cards.

Cost Curve Distribution

{{ cnt }}
{{ cst }}

Storage & Inventory Center

Organize physical card storage boxes, track cards allocated to active decks, identify deck shortages, and mass buy unowned cards on TCGPlayer.

Total in Built Decks {{ rentedCards.reduce((sum, c) => sum + (c.total_allocated || 0), 0) }} Physical copies in built decks
Active Deck Cards {{ rentedCards.length }} Distinct card titles in active decks
Active Built Decks {{ savedDecks.filter(d => d.is_active).length }} Decks currently assembled
Deck Conflicts {{ conflicts.length }} {{ conflicts.length > 0 ? 'Shortages across decks' : 'Zero card shortages' }}
Inventory Shortage Alert: You have {{ conflicts.length }} card(s) where built decks need more physical copies than you own!
Filter by Deck:

Scanning physical deck allocations and storage...

{{ c.block_number }}

{{ c.card_name }}

{{ c.card_id }} • {{ c.set_id === 'P' ? 'Promo' : c.set_id }} • {{ c.card_color }}

In Decks: {{ c.total_allocated }}x
In Storage: {{ c.in_storage }}x
Shortage: Need {{ c.shortage }} more copies
Currently in Decks:
{{ d.deck_name }}: {{ d.quantity }}x {{ d.is_leader ? '(Leader)' : '' }}

No Cards Currently in Built Decks

You currently have no built decks allocating physical cards, or no cards match your search. Mark any deck as "Built" in the Deck Builder to allocate your physical cards here.

Selection:
Deck:
{{ selectedMassBuyCount }} cards ({{ selectedMassBuyTotalCopies }} copies) selected

Calculating missing copies across all saved decks...

{{ c.block_number }}

{{ c.card_name }}

{{ c.card_id }} • {{ c.set_id === 'P' ? 'Promo' : c.set_id }} • {{ c.card_color }}

Owned: {{ c.owned_count }}x
Missing: {{ c.missing_count }}x
Buy Qty:
{{ getMassBuyQty(c.card_id, c.missing_count) }}
Decks: {{ d.deck_name }} ({{ d.quantity }}x)
TCGPlayer →

No Deck Shortages!

You own all physical copies required for your current decks. Want to explore cards you don't own to build new decks?

Filter Set:
Selection:
{{ selectedMassBuyCount }} cards ({{ selectedMassBuyTotalCopies }} copies) selected

Loading unowned cards catalog...

{{ c.block_number }}

{{ c.card_name }}

{{ c.card_id }} • {{ c.set_id === 'P' ? 'Promo' : c.set_id }} • {{ c.card_color }}

Status: 0 Owned
Buy Copies:
{{ getMassBuyQty(c.card_id, 1) }}
{{ c.card_type }} • Cost {{ c.card_cost !== null ? c.card_cost : '-' }} TCGPlayer →

No Unowned Cards Found

No unowned cards match your current search and set filters. Try clearing your filters or searching another set.

Page {{ unownedPage }} of {{ unownedTotalPages }} ({{ unownedTotal }} Unowned Cards)
Total Copies Owned {{ stats.total_owned }} Across all printings
Unique Cards Owned {{ stats.unique_owned }} Out of {{ stats.total_unique_db }} in database
In Storage Boxes {{ stats.in_storage }} Unallocated copies
In Built Decks {{ stats.in_decks }} In {{ stats.active_decks_count }} active decks

Collection Progress by Set

Click any set below to instantly view your owned cards in that set!

{{ s.set_id === 'P' ? 'Promo' : s.set_id }} {{ s.owned_in_set }} / {{ s.total_in_set }} Owned
{{ Math.round((s.owned_in_set / (s.total_in_set || 1)) * 100) }}% complete • {{ s.total_copies_in_set || s.owned_in_set }} total copies
View Cards →

Backup & Restore Collection

Export your personal inventory and decks as a JSON file, or restore from a backup.

Sign In to OPBinder

Save and sync your collection across all devices

{{ authError }}
✓
100% Free Guest Mode:

Browse all 2,800+ cards, search, filter, build decks in memory, and view set statistics without an account.

✓
Cloud Sync with Google:

Sign in to save your personal owned cards, custom decks, and box allocations securely to Cloudflare D1.

✓
Better Auth Security:

Standard OAuth 2.0 flow. No mock sessions or passwords stored.

Explore first?
{{ (currentUser.display_name || currentUser.username || currentUser.email || 'U')[0] }}

Account Profile Google Account

Synced via Better Auth

Signed In User
{{ currentUser.display_name || currentUser.name || currentUser.email }}
Google Email Address
{{ currentUser.email || 'Google User' }}
Authentication Provider
Google OAuth 2.0 via Better Auth
Total Cards Synced
{{ inventoryTotalCards || 0 }}
Saved Cloud Decks
{{ savedDecks ? savedDecks.length : 0 }}