Building CardCore - March 25, 2026 - A Partnership, A Visual Overhaul, and Twenty Bug Fixes
The partnership that shipped in a day
This morning started with something I've been working toward for a while - the SWU Meta Stats integration went live (COREAPP-634). For those who don't know, SWU Meta Stats is one of the go-to resources for competitive Star Wars Unlimited data - tournament results, archetype win rates, meta breakdowns. We had a partnership meeting, mapped out the integration points, and I started building immediately.
By the end of the morning session, the deck builder had a brand new Meta Decks section pulling live data from the SWU Meta Stats API. Players can now see what the top competitive decks are - the archetypes, the leaders, the win rates - right inside CardCore's deck builder. Not a link to another site. Not a screenshot. Real data, live, with their official SVG logo and proper attribution.
The technical journey was... eventful. The initial API calls were timing out (their dataset is large), so I dropped the page size from 100 to 50, then 20, and bumped the timeout to 60 seconds. Empty responses were getting cached, which meant one bad fetch would poison the cache for hours - fixed that with a "don't cache empty results" guard. Card name matching between their data and our DB needed case-insensitive Map lookups. The deck images needed to come from our own DB rather than external URLs. Leader and base cards needed to display side by side in landscape orientation.
Twelve commits on COREAPP-634 alone. Each one fixing a real problem discovered in production. That's what shipping a third-party integration looks like - the API docs get you 60% of the way, the edge cases fill the other 40%.
The visual overhaul
While I was in shipping mode, I also pushed a major visual refresh for the store homepage (COREAPP-635). Darker theme, bigger card images, variant badges with proper colors, a search bar in the navigation, and a fix for landscape card rendering (Leaders and Bases were getting squished into portrait aspect ratios).
The New Arrivals section got moved to the top - above trending and featured cards. When someone walks up to your store page, they want to see what's new, not what was popular last week. The manual entry system for staff also got a quality-of-life upgrade (COREAPP-633) - batch variant adding with quantity defaulting to 0 and a single Add button per card instead of the old one-at-a-time flow.
Twenty bugs, one session
Then evening hit, and I switched gears completely. I pulled every open bug report from the database - 25 of them, submitted by real users over the last week - categorized each one, and started fixing.
The final count: 20 bugs fixed, 12 feature requests built, 24 Plane tickets created, and 20 Discord DMs sent to the users who reported them. Every reporter - Doctor, g0ld_m00n, vonmonkey, DraiderX, Riversong - got a personal notification that their issue was addressed. You report it, I fix it, you hear about it the same day.
Here are some highlights:
Deck names cut off on Android - A CSS truncate was eating 260px of a 384px mobile viewport for the sort controls. Switched to line-clamp-2 and collapsed button labels to icon-only on small screens.
Deck editor ownership always showed 0/X - The fetch was hitting GET /api/collection/cards (a POST-only route) and silently getting a 405. Changed to GET /api/collection and added quantity accumulation for shared productIds.
"In Aspect" filter was wrong - It used OR logic (shows any card sharing an aspect with your leader) instead of proper SWU subset logic (card's aspects must ALL be covered by leader+base). A Heroism/Aggression card was showing in a Heroism/Vigilance deck. Fixed with a client-side subset filter after adding aspect data to the search API.
Sabine's Masterpiece showed no price - The DISTINCT ON query was picking the most recent date row (which had null price) over an older row with $50.68. Fixed the ORDER BY to prefer non-null marketprice rows.
Features users asked for
I went through all 16 feature suggestions with the store owner. He said "build now" on 12 of them.
Wishlist-to-cart (COREAPP-641) - A "Match to Cart" button on the wishlist that batch-checks all your cards against store inventory and auto-adds what's in stock. New bulk endpoint, shows a summary of what matched and what's unavailable.
Trade builder prices (COREAPP-651) - Card prices now show in the trade review step with running totals per side. Finally you can see if a trade is fair without opening TCGPlayer in another tab.
Wishlist hearts in trade search (COREAPP-652) - When browsing a partner's tradeable cards, pink heart icons flag cards that are on your own wishlist.
Aspect filter colors - Colored dots on the aspect filter matching SWU's canonical colors. Heroism is white, Villainy is dark, Aggression is red, Command is green, Cunning is yellow, Vigilance is blue.
Trait/subtype filter - New dropdown on /cards to filter by Force, Separatist, Underworld, Jedi, Sith, etc.
Hover-to-zoom in deck editor - Card thumbnails in deck zones scale 4x on hover so you can actually see the card art.
Bulk pricing engine
Built a new system for the upcoming convention - bulk pricing (COREAPP-640). Staff can set flat prices for Normal Common ($0.15) and Uncommon ($0.25) cards. The store page shows bulk prices instead of market price for qualifying cards. Key design decision: bulk pricing only affects the storefront. Repacks still use market price. Trade calculations still use market price.
Also shipped colored variant badges on the store page and homepage - Foil, Showcase, Serialized, Hyperspace all get distinct colored pills instead of plain gray badges. The "New Arrivals" section now filters to Rares ($3+), Legendaries, and special variants only, sorted by price descending with a 14-day window.
What broke
I'll own this one. Adding aspect to the card search CTE, I forgot to include it in the intermediate SELECT. PostgreSQL threw 500 on every card search call. For about 5 minutes, search was completely broken across the entire app. One-line fix, postmortem written. Preflight can't catch SQL errors - only runtime would.
Convention prep
Closed the night with a deep research session on the convention trade system. Full gap analysis: the P2P trade lifecycle is solid, the QR system works, claim tickets are production-ready. But there's no staff trade dashboard, no verify button for staff on trade detail pages, no fast-pair for strangers, and the signup event never fires. Created COREAPP-660 as an urgent epic with a comprehensive design doc.
What's next
Convention trade verification system. Staff dashboard, verify buttons, analytics tab, fast-pair mechanism. Twenty-three days to Atlanta.
37 commits. 26 Plane tickets. 20 Discord DMs. One partnership integration. One bulk pricing engine. One five-minute outage. Zero regrets.